Kotlin 在Android使用问题

1、kotlin与Databinding的使用出现 ”Unresolved reference: ActivityMainBinding“的错误
解决方案:

app.build:

kapt {
    generateStubs = true
} 
dependencies {
    kapt "com.android.databinding:compiler:2.3.0"
}

2、避免 !! 的方法
1. 用 val 而不是 var
在 Kotlin 中 val 代表只读,var 代表可变。建议尽可能多的使用 val。val 是线程安全的,并且不需要担心 null 的问题。只需要注意 val 在某些情况下也是可变的就行了。
2. 使用 lateinit
有些情况我们不能使用 val,比如,在 Android 中某些属性需要在 onCreate() 方法中初始化。对于这种情况,Kotlin 提供了 lateinit 关键字。(基础类型long int等不能使用lateinit ,默认lateinit是赋值为null,基础类型不存在null)

private lateinit var mAdapter: RecyclerAdapter

override fun onCreate(savedInstanceState: Bundle?) {
   super.onCreate(savedInstanceState)
   mAdapter = RecyclerAdapter(R.layout.item_transaction)
}

fun updateTransactions() {
   mAdapter.notifyDataSetChanged()
}

要注意,访问未初始化的 lateinit 属性会导致 UninitializedPropertyAccessException。
并且 lateinit 不支持基础数据类型,比如 Int。对于基础数据类型,我们可以这样:

private var mNumber: Int by Delegates.notNull<Int>()

3、使用let函数
这里选择 let 函数是一个更优雅的解决方法:

private var mPhotoUrl: String? = null

fun uploadClicked() {
    mPhotoUrl?.let { uploadPhoto(it) }
}
  1. :lazy和lateinit的区别
    .lazy{} 只能用在val类型, lateinit 只能用在var类型 如 :
    val name: String by lazy { “sherlbon” }
    lateinit var adapter: MyAdapter
    12
    .lateinit不能用在可空的属性上和java的基本类型上 如:
    lateinit var age: Int //会报错
    1
    .lateinit可以在任何位置初始化并且可以初始化多次。而lazy在第一次被调用时就被初始化,想要被改变只能重新定义(因为只能定义常量)
    .lateinit 有支持(反向)域(Backing Fields)

懒加载的另一方面应用:
减少Application启动时间,使得一些必要的框架在有需求的时候加载:例如
Kotlin 在Android使用问题_第1张图片

5、使用拓展函数扩展API的方法或者变量,方便调用
例如:
Application初始化:拓展在Activity中直接使用的变量
Kotlin 在Android使用问题_第2张图片

Activity直接使用:

Kotlin 在Android使用问题_第3张图片

你可能感兴趣的:(android)