Cannot set non-nullable LiveData value to null

13.6k Views Asked by At

The error from the title is returned for the following code, which makes no sense

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


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

parameter String of _error is obviously nullable, am I doing something wrong?

6

There are 6 best solutions below

1
On BEST ANSWER

This appears to be related to a bug already reported against androidx.lifecycle pre-release of 2.3.0 https://issuetracker.google.com/issues/169249668.

Workarounds I have found:

  1. turn off or reduce severity of NullSafeMutableLiveData in

build.gradle

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

or lint.xml in root dir

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="NullSafeMutableLiveData" severity="warning" />
</lint>
  1. Do the work for MutableLiveData encapsulation via backing properties dance (which really hurts my eyes).
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
    }
}
0
On

It seems fixed in lifecycle 2.4.0-SNAPSHOT. Please wait for the official release.

0
On

I think this has been fixed in version 2.4.1

this is my working solution

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
}
2
On
0
On

Add NullSafeMutableLiveData in your function,

@Suppress("NullSafeMutableLiveData")
fun clearBeforeData(){
    _articles.postValue(null)
}
0
On

This issue was coming in 2.3.0 also but after upgrading to 2.4.0 it is not coming.