Kotlin從入門到掉坑裡

来源:http://www.cnblogs.com/sw926/archive/2016/09/14/5870326.html
-Advertisement-
Play Games

為什麼要用Kotlin,和Java完全相容,相互之間引用完全不是問題,所有沒有什麼負擔。 使用Kotlin已經近一個月,基本上看完了語法就上正式項目了,期間幾次準備放棄,最終堅持下來了。關於Kotlin的優點,不必多說了,基於這一個月的經驗,來說說Kotlin的入門和坑。 配置工程 添加依賴 作為一 ...


為什麼要用Kotlin,和Java完全相容,相互之間引用完全不是問題,所有沒有什麼負擔。
使用Kotlin已經近一個月,基本上看完了語法就上正式項目了,期間幾次準備放棄,最終堅持下來了。關於Kotlin的優點,不必多說了,基於這一個月的經驗,來說說Kotlin的入門和坑。

配置工程

添加依賴

作為一個Android碼農,使用Kotlin很簡單,首先在Android Studio中安裝Kotlin插件,在Browse repositories中搜索Kotlin,安裝人數最多的那個就是。
安裝完成之後,連續按4下shift鍵,輸入config kotlin 進行搜索,選擇Config Kotlin in Project,選擇Android Gradle,選擇app module,工程就配置完成。

轉換Java到Kotlin

連續按4下shift鍵,輸入Convert Java Files 進行搜索,選擇Convert Java Files to Kotlin Files,可以自動將Java轉換為Kotlin

入門

變數聲明

  • var 可變變數
  • val 不可變變數

聲明變數的格式

var str: String

Kotlin不允許聲明變數但不初始化,以String為例,以下三種初始化方式

賦非空值

var str: String = ""

設為null

var str: String? = null

強制設為null

var str: String = null!!

Kotlin是空安全的,但是第三種是例外情況,如果給一個變數賦值為null!!,那麼就等於聲明這個變數不是空安全的,就算這樣使用

var str:String = null!!
str.length

編譯器也不會報錯

第一種方式,賦值之後不能將str設為null或其他String?的值,否則編譯器會報錯,第二種方式,每次使用時必須要進行檢查,直接使用的話編譯器會報錯,這樣就保證了空安全。舉個例子:

var str: String = ""
// str 不是空的,可以直接使用不必檢查是否為空
// 可以隨意給str賦非空值
str = "hello kotlin"

// 這樣編譯器是會報錯的
str = null

// 如果強制設為null,str就不再是空安全的,編譯也就不會檢查str了
str = null!!

// 聲明str2為可空的變數,str2也是空安全的
var str2: String? = null

// 直接使用str2編譯器會報錯
str2.length
// 可以這樣用
str2?.let {
    log(str2)
}

// str2賦值給str也會報錯

最後達到的目的就是,使用一個空變數會報錯,使用一個可能為空的變數不檢查也會報錯,如果覺的檢查是否為空太麻煩了,Kotlin支持

if (result?.data?.item?.name != null) {
    log(result?.data?.item?.name)
}

lamda

神奇的it

Kotlin的lamda表達式很簡潔,設置OnClickListener

textView.setOnClickListener {
    view -> openActivity(view.context)
}

只有一個參數的時候,是可以隱藏的,用it

textView.setOnClickListener {
    openActivity(it.context)
}

多個參數的時候

checkbox.setOnCheckedChangeListener { compoundButton, b ->
}

Kotlin的函數可以作為參數,寫callback的時候,可以不用interface了

// 聲明一個callback
var callback: (()->Unit)? = null
// 判斷並使用
callback?.invoke()

// 想帶參數
var callback: ((str: String)->Unit)? = null
// 判斷並使用
callback?.invoke(str)

// set callback
item.callback = {
    // do something
}
// 帶參數的callback
item.callback = {
    doSomething(it)
}

遇到的坑

Databinding

需要在app moudle的build.gradle裡面添加

kapt {
    generateStubs = true
}
dependencies {
    kapt 'com.android.databinding:compiler:2.2.0-rc2'
}

2.2.0-rc2 這個版本號必須要和根目錄下的build.gradle文件內的com.android.tools.build:gradle:2.2.0-rc2 版本號一致

Dagger2

官方博客說是支持Dagger2的,但實際遇到的情況是和Databinding結合使用有問題

奇怪的報錯

使用Databinding,設置ViewModel時

cannot access class '...'. check your module classpath for missing or conflicting dependencies

應該是Kotlin的bug,只是報錯,不影響編譯,如果不希望提示錯誤,可以添加
@Suppress("MISSING_DEPENDENCY_CLASS")

編譯的時候報找不到class的問題,clean一下就好,不知道什麼原因

不知道代碼怎麼寫

Java的代碼提示很方便,setListener,基本只用輸入new,按代碼提示回車就自動完成了,匿名函數應該怎麼寫呢

 textView.setOnClickListener(object: View.OnClickListener {
            override fun onClick(v: View?) {
            }
})

靜態變數應該怎麼寫呢

class A {
    companion object {
        val TAG = "classA"
    }
}

// 在Java代碼中使用
A.Companion.getTAG()

怎麼從Kotlin轉為Java

兩種方法

  • 打包,輸出apk,使用dex2jar將apk代碼文件提取成jar,使用jd-jui查看,將對應的代碼拷貝出來,修改,使用
  • 把Kotlin文件刪掉,用Java重寫一遍

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • [1]頁面設計 [2]菜單邏輯 [3]功能實現 [4]完整源碼 ...
  • 在IE8以認為只有文本標簽才有name屬性的,一些元素標簽用document.getElementsByName獲取不到DOM,如DIV,span等,這裡做一下相容。 HTML: 相容JS: 測試JS: ...
  • getElementsByClassName是通過class來獲取DOM,但是IE8及以下不能相容。這裡做了一下相容性。 HTML: 相容JS: 測試: 結果: IE7谷歌火狐 ...
  • “正則表達式”描述在搜索文本正文時要匹配的一個或多個字元串。 該表達式可用作一個將字元模式與要搜索的字元串相匹配的模板。 正則表達式包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為“元字元”)。 特殊字元 若要匹配這些特殊字元之一,必須首先轉義字元,即,在字元前面加反斜杠字元 (\)。  ...
  • 在資料庫獲取一些新聞時,有時文字過多,為了不破壞佈局,常常需要只顯示一部分,這是需要用到文字截斷的功能。雖然css也可以實現,但是限制太多 css實現需要text-overflow:ellipsis;overflow:hidden;white-space:nowrap;三個屬性,另外還需要文本標簽寬 ...
  • CSS3實現輪播圖主要是由css:background-position和css3:animation實現。且實現此輪播需要一張四個圖橫著相連的圖片。 註(Internet Explorer 10、Firefox 以及 Opera 支持 animation 屬性。Safari 和 Chrome 支持 ...
  • 給自己定一個小目標,一個禮拜完成100個inkscape案例。 今天完成picture on the wall ...
  • 前言: 最近一個多月在認真的學習Android和做項目,文章內容表達的不好或者理解錯了,希望大家評論指出。 :-) 本文是總結幾個比較常用且使用的技巧,和一個大家都會遇到的問題。 文章中大部分語句摘抄自一下兩篇大神寫的文章:(如果對ExpandableListView一無所知,建議按照順序去閱讀,遇 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...