Kotlin常见知识点和踩坑指南

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
                        }
                    }
                }
            })
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值