DylanCaiCoding / ViewBindingKTX

The most comprehensive utils of ViewBinding. (最全面的 ViewBinding 工具,支持 Kotlin 和 Java 用法,支持 BRVAH,支持封装到基类,支持 DataBinding,支持选择是否使用反射)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用反射集成到基类的库

1Patience-and-1careful opened this issue · comments

fragment 的封装
private var _binding: T? = null
val mBinding: T get() = _binding!! 强行非空
这里又设为null
override fun onDestroy() {
_binding = null
super.onDestroy()
}
你确定这里没安全隐患吗,某些特殊的场景会导致应用直接崩溃的

这是官方的写法,如果 View 都为 null 了,ViewBinding 当然也为 null 了,这时获取 ViewBinding 对象是会报错,就像 View 释放了再去获取 View 一样。

这是个取舍的问题,可以定义为 var binding: T? = null,但这为了那少数情况(比如异步回调更新 UI 时 ViewBinding 已释放),就需要在全部 Fragment 上的控件写 binding?.xxxx?.xxxx 的问号判断的代码,而绝大多数情况 binding 都不为 null。如果按照官方 Jetpack MVVM 架构来写代码,异步操作会和生命周期绑定的,也就是说回调的时候 Fragment 已经销毁的话,后续的 UI 更新是不执行的。

_binding!! 强行非空是会存在隐患,但代码写得规范的话基本是可以规避的。如果定义为可空,就需要加巨量的问号代码,这是非常不值得的。