掌握基础的知识点,不必深入,随着项目遇到的问题再深入理解对应知识点
有些地方照样可以用java,比如依赖库
转成kotlin代码,还需要要人工重构的点
碰到的问题
转成kotlin代码,还需要要人工重构的点
- findviewbyid 代码
- 协程重构Rxjava等引入线程部分的代码
碰到的问题
-
在哪里可以体现greendao 可以支持kotlin版本。
不必修改,依赖库不需修改成kotlin版本,kotlin可以共存
https://github.com/greenrobot/greenDAO -
配置
项目build.gradle
// 注意apply plugin不能定义在基础module中
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-android-extensions: $kotlin_version"
kapt {
generateStubs = true
}
模块的build.gradle
- 这个怎么转 (BaseListFragment)
解决方式
兼容解决
mQuickAdapter.setNewData(datas as List<Nothing>?)
mQuickAdapter.addData(datas as Collection<Nothing>)
- findviewbyid
val view = root.findViewById(R.id.view_pwd)
root.findViewById(R.id.et_newpwd)
前者为啥有泛型,不能直接通过anko来获取?
XEditText 也不行
Kotlin之Fragment中直接引用视图控件id
https://blog.csdn.net/wxx_csdn/article/details/78261903
- lateinit var 和var 区别
https://www.jianshu.com/p/09ca7483c30d - Kotlin-Not enough information to infer parameter T in fun<T:View> findViewById(id: Int): T!
T 为对应的控件
holder.btnInstall = convertView.findViewById(R.id.btn_install) as T
改为
holder.btnInstall = convertView.findViewById<T>(R.id.btn_install)
-
Nothing的用途
??https://blog.csdn.net/ldxlz224/article/details/94403626 -
集合 https://kymjs.com/code/2017/06/06/01/
-
解决协程封装回调的那些过程
解决点suspendCoroutine 通过 co.resume
CoroutineScope(Dispatchers.Main).launch {
var respPkt = async(Dispatchers.IO) {
suspendCoroutine<T> { co ->
val req // 请求体组装 TODO
// 发送请求登录
ApiUtil.getAsyncClient().action(req, object : AsyncMethodCallback<nyUserServ.AsyncClient.action_call> {
override fun onComplete(response: nyUserServ.AsyncClient.action_call) {
// 解析数据,TODO
if (正确)
{
co.resume(respPkt) // 把最终结果返回 ,相当于rxjava 中 emitter.onNext(respPkt);
} else{
}
}
override fun onError(exception: Exception) {
// 异常处理
co.resumeWithException(exception)
}
})
}
}.await()
// respPkt 其实就是 onComplete返回的对象respPkt
// 正确返回的话要走的逻辑 TODO
}