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<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) }
}
  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启动时间,使得一些必要的框架在有需求的时候加载:例如
这里写图片描述

5、使用拓展函数扩展API的方法或者变量,方便调用
例如:
Application初始化:拓展在Activity中直接使用的变量
这里写图片描述

Activity直接使用:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值