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<Transaction>
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) }
}
- :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启动时间,使得一些必要的框架在有需求的时候加载:例如
5、使用拓展函数扩展API的方法或者变量,方便调用
例如:
Application初始化:拓展在Activity中直接使用的变量
Activity直接使用:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)