【问题标题】:Cannot set non-nullable LiveData value to null无法将不可为空的 LiveData 值设置为 null
【发布时间】:2020-12-16 12:04:23
【问题描述】:

下面的代码返回标题的错误,没有意义

private val _error = MutableLiveData<String?>()
val error: LiveData<String?> get() = _error


_error.postValue(null)  //Error Cannot set non-nullable LiveData value to null [NullSafeMutableLiveData]

_error 的参数String 显然可以为空,我做错了吗?

【问题讨论】:

  • 这是编译时错误吗?您使用的是什么版本的 arch 组件?
  • 尝试使缓存失效或更新依赖,你的代码没有问题。
  • @ADM 是编译时间 Lint 错误仅用于发布构建,调试构建工作正常。 Android Studio 也显示此错误。部分组件版本不同,lyfecycle-livedata 为 2.3.0.beta01
  • @VincentSit 一切都是最新的,无效缓存没有帮助
  • 不确定是否相同,但他们在最近的版本2.3.0-alpha07 中修复了一个问题。 See this 。只是建议最好在生产中使用稳定版本的库。对于现在的解决方案,您可以忽略 lint check

标签: android kotlin android-livedata kotlin-null-safety


【解决方案1】:

这似乎与已报告的针对 androidx.lifecycle 2.3.0 预发行版 https://issuetracker.google.com/issues/169249668 的错误有关。

我发现的解决方法:

  1. 关闭NullSafeMutableLiveData in 或降低其严重性

build.gradle

android {
  ...
  lintOptions {
    disable 'NullSafeMutableLiveData'
  }
}

或根目录中的lint.xml

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="NullSafeMutableLiveData" severity="warning" />
</lint>
  1. 通过支持属性进行 MutableLiveData 封装工作(这真的很伤我的眼睛)。
class ExampleViewModel : ViewModel() {

    private val _data1 = MutableLiveData<Int>()
    val data1: LiveData<Int> = _data1

    private val _data2 = MutableLiveData<Int?>()
    val data2: LiveData<Int?> = _data2

    fun funct() {
        _data1.value = 1
        _data2.value = null
    }
}

【讨论】:

【解决方案2】:

【讨论】:

【解决方案3】:

它似乎已在生命周期 2.4.0-SNAPSHOT 中修复。 请等待正式发布。

【讨论】:

    【解决方案4】:

    2.3.0 也出现了这个问题,但升级到 2.4.0 后就没有了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 1970-01-01
      • 2021-10-12
      • 2014-07-18
      • 2022-01-04
      • 1970-01-01
      • 2017-08-26
      相关资源
      最近更新 更多