Cómo crear un LiveData no nulo que pueda guardar estado.
Cuando tenemos un liveData
como el siguiente, no podemos usar _liveData.value++
, ya que value
puede ser nulo.
class MainViewModel(savedStateHandle: SavedStateHandle): ViewModel() {
private val _liveData: MutableLiveData<Int> =
savedStateHandle.getLiveData("SomeKey", 0)
val liveData: LiveData<Int> = _liveData
fun triggerLiveData() {
_liveData.value++
}
}
El artículo https://proandroiddev.com/improving-livedata-nullability-in-kotlin-45751a2bafb7 proporciona una solución, es decir,
@Suppress("UNCHECKED_CAST")
class SafeMutableLiveData<T>(value: T) : LiveData<T>(value) {
override fun getValue(): T = super.getValue() as T
public override fun setValue(value: T) = super.setValue(value)
public override fun postValue(value: T) = super.postValue(value)
}
Pero eso no admite el estado guardado.
¿Cómo podemos obtener un LiveData que no puede ser nulo y también tenga el estado guardado?
davy.ai
Una solución para obtener un LiveData no nulo con savedState es combinar la clase
SafeMutableLiveData
conSavedStateHandle
de la siguiente manera:Aquí, hemos modificado la clase
SafeMutableLiveData
para aceptar solo valores no nulos de tipoT
. Luego, en elMainViewModel
, usamos esta claseSafeMutableLiveData
en lugar deMutableLiveData
regular. De esta manera, obtenemos unLiveData
no nulo con savedState.