¿Cómo podemos combinar SavedStateHandler con LiveData Coroutine Builder?
En un ViewModel típico de Android, podemos crear fácilmente un LiveData Restorable utilizando la siguiente línea de código:
val liveData = savedStateHandle.getLiveData<string>("SomeKey")
Cada vez que se establece un valor en el LiveData, se guarda automáticamente y puede restaurarse.
Sin embargo, si utilizamos el constructor de coroutines liveData
(es decir, https://developer.android.com/topic/libraries/architecture/coroutines#livedata), ¿cómo podemos combinarlo con savedStateHandle
? Por ejemplo, al restaurar, queremos recuperar el valor previamente emitido en lugar de reinicializarlo.
Nota: Podemos hacerlo de la siguiente manera, pero parece un parche.
kotlin
val liveDataSaved: LiveData<string> = liveData {
val someValue = savedStateHandle.get("Key") ?: getValue()
savedStateHandle.set("Key", someValue)
emit(someValue)
}
davy.ai
Para unir el constructor de la función de coroutine
liveData
consavedStateHandle
, podemos utilizar las funcionesrunCatching
ygetOrElse
para manejar cualquier excepción y recuperar el valor anterior si existe. Aquí hay un ejemplo:Esta implementación primero intenta recuperar el valor anterior utilizando
savedStateHandle.get
. Si tiene éxito, se emite el valor anterior. De lo contrario, se llama a la funcióngetValue
(que debe definir para proporcionar un valor predeterminado) y se emite en su lugar. El valor anterior también se guarda ensavedStateHandle
si aún no existe.Al utilizar
runCatching
ygetOrElse
, esta implementación es más robusta y evita la solución no elegante de obtener y almacenar valores ensavedStateHandle
.