kotlin 无法将不可为空的LiveData值设置为空

1szpjjfi  于 2022-12-04  发布在  Kotlin
关注(0)|答案(6)|浏览(586)

对于以下代码,将返回来自标题的错误,这没有任何意义

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明显可以为空,我做错了什么吗?

eblbsuwk

eblbsuwk1#

这似乎与针对2.3.0 https://issuetracker.google.com/issues/169249668androidx.lifecycle预发行版已报告的错误有关。
我找到的解决方法:
1.关闭或降低NullSafeMutableLiveData的严重性
build.gradle

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

或根目录中的lint.xml

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="NullSafeMutableLiveData" severity="warning" />
</lint>

1.通过backing properties dance为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
    }
}
cpjpxq1n

cpjpxq1n2#

此问题已在2.3.1版中得到修复。
https://developer.android.com/jetpack/androidx/releases/lifecycle#version_231_2

aelbi1ox

aelbi1ox3#

似乎在生命周期2.4.0-快照中得到了修复。请等待正式发布。

tez616oj

tez616oj4#

这个问题也出现在2.3.0中,但升级到2.4.0后就不会出现了。

gcmastyq

gcmastyq5#

在函数中添加NullSafeMutableLiveData,

@Suppress("NullSafeMutableLiveData")
fun clearBeforeData(){
    _articles.postValue(null)
}
83qze16e

83qze16e6#

我想这个问题已经在version 2.4.1中修复了
这是我的工作解决方案

private val _roomDataObserver: MutableLiveData<List<Resource<ModelClass?>>?> = MutableLiveData()
val roomDataObserver: LiveData<List<Resource<ModelClass?>>?>
    get() = _classroomDataObserver

 override fun onCleared() {
    super.onCleared()
    Log.d("VIEWMODEL", "CLEARED")
    _roomDataObserver.value = null
}

相关问题