es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución para obtener un LiveData no nulo con savedState es combinar la clase SafeMutableLiveData con SavedStateHandle de la siguiente manera:

    @Suppress("UNCHECKED_CAST")
    class SafeMutableLiveData<t :="" any="">(value: T?) : MutableLiveData<t>(value) {
    
        override fun getValue(): T = super.getValue()!!
    
        override fun setValue(value: T?) {
            super.setValue(value)
        }
    
        override fun postValue(value: T?) {
            super.postValue(value)
        }
    }
    
    class MainViewModel(private val savedStateHandle: SavedStateHandle) : ViewModel() {
    
        private val _liveData: SafeMutableLiveData<int> =
            savedStateHandle.getLiveData("SomeKey", 0)
    
        val liveData: LiveData<int> = _liveData
    
        fun triggerLiveData() {
            _liveData.value++
        }
    }
    

    Aquí, hemos modificado la clase SafeMutableLiveData para aceptar solo valores no nulos de tipo T. Luego, en el MainViewModel, usamos esta clase SafeMutableLiveData en lugar de MutableLiveData regular. De esta manera, obtenemos un LiveData no nulo con savedState.

Comments are closed.