1.Kotlin支持View binding
当我们需要使用Kotlin的View binding特性时,需要进行如下操作:
在app目录下的build.gradle里面添加:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
在项目目录下的build.gradle里面添加:
buildscript {
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
}
}
即可享受不用写findViewById操作了!
2.Proguard的BUG
proguard 的 bug 会导致 Kotlin 的 suspend 函数被混淆错,需要使用 proguard 6.2.0 以后的版本:
// build.gradle.kts
buildscript {
configurations.all {
resolutionStrategy {
force("net.sf.proguard:proguard-gradle:6.2.2")
}
}
}
3.Kotlin替换if-else判空方法
Java中使用if-else判空后进行非空和为空的操作,在kotlin中可以不需要这么复杂,只要通过let关键字即可:
val work:String? = null
work?.let {
// work不为空
} ?: let {
// work为空
}
4.在DialogFragment里面利用viewBinding特性通过view id操作时,如果Dialog被销毁后再这样操作就会报空指针
这个是case是在dialog里面进行网络操作,由于结果没有回来之前关闭了弹窗,导致关闭弹窗后,通过view的id去操作最终触发空指针。
exception: java.lang.IllegalStateException
message: tv_vs_qualifier_invite_from_level_name must not be null
stack: xxx.vs.view.bu.run(VsSettingDialog.kt:230)
android.os.Handler.handleCallback(Handler.java:790)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:192)
android.app.ActivityThread.main(ActivityThread.java:6840)
java.lang.reflect.Method.invoke(Native Method)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:549)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:826)
解决方案:在操作view之前判断是否为空。
AppUserLet.getUserLevelInfo(toUid, object : IGetUserLevelInfoListener.Stub() {
override fun onGetUserLevelInfoSuccess(resCode: Int, userType: String, userLevel: Int, userCoin: Long, needMoreCoin: Long) {
if (isShow) {
ThreadUtils.runOnUiThread {
val levelText = "Lv $userLevel"
tv_vs_qualifier_invite_to_level_name?.text = levelText
}
}
}
override fun onGetUserLevelInfoFail() {
if (isShow) {
ThreadUtils.runOnUiThread {
val levelText = "Lv 0"
tv_vs_qualifier_invite_to_level_name?.text = levelText
}
}
}
})