MVVM中MutableLiveData已赋初始值调用getValue()仍报空指针警告该如何正确使用?
MutableLiveData getValue() 空指针警告原因与正确用法
警告触发原因
MutableLiveData的getValue()方法在AOSP的Java源码中定义的返回值为可空泛型@Nullable T,Lint、Kotlin类型检查等静态检查工具无法识别你手动设置初始值的业务约定,即便你从未主动赋值为null,检查工具依然会判定返回值存在null风险。当你将返回值赋值给int、boolean这类需要拆箱的基础数据类型时,就会触发空指针异常的警告。
正确使用方式
- 优先使用观察者模式取值
这是LiveData的标准使用方式,遵循响应式设计原则,不需要手动同步取值,也不会有空安全问题。示例:// Kotlin 示例 loream.observe(viewLifecycleOwner) { value -> // 如果你声明的LiveData泛型为非空,此处value一定非空,无需额外处理 // 直接使用value即可 }// Java 示例 loream.observe(getViewLifecycleOwner(), value -> { // 直接使用value }); - 必须同步取值时,添加空安全兜底
如果你有必须同步获取当前值的场景,根据开发语言做对应处理:- Kotlin环境用Elvis操作符指定兜底默认值:
如果你100%确认此时LiveData一定有值,也可以用非空断言val value = loream.value ?: 0 // 0替换为你对应的初始值即可!!,但非常不推荐,异常场景下会直接触发崩溃。 - Java环境先做空判断再使用:
Integer value = loream.getValue(); int finalValue = value == null ? 0 : value;
- Kotlin环境用Elvis操作符指定兜底默认值:
- 全局避免警告:封装非空LiveData子类
如果你需要在项目中大量使用带初始值的非空LiveData,可以自定义子类强制非空,从类型层面避免空警告:
后续直接用该子类声明LiveData即可,调用class NonNullMutableLiveData<T : Any>(private val defaultValue: T) : MutableLiveData<T>(defaultValue) { override fun getValue(): T = super.getValue() ?: defaultValue override fun setValue(value: T) { super.setValue(value) } override fun postValue(value: T) { super.postValue(value) } }getValue()不会再触发空警告。
内容的提问来源于stack exchange,提问作者Kursad
相关产品推荐
相关产品推荐

