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 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)
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para unir el constructor de la función de coroutine liveData con savedStateHandle, podemos utilizar las funciones runCatching y getOrElse para manejar cualquier excepción y recuperar el valor anterior si existe. Aquí hay un ejemplo:

    val liveDataSaved: LiveData<string> = liveData {
        runCatching {
            savedStateHandle.get<string>("Key")
        }.getOrElse {
            getValue()
        }?.let { previousValue ->
            emit(previousValue)
        }
    }
    

    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ón getValue (que debe definir para proporcionar un valor predeterminado) y se emite en su lugar. El valor anterior también se guarda en savedStateHandle si aún no existe.

    Al utilizar runCatching y getOrElse, esta implementación es más robusta y evita la solución no elegante de obtener y almacenar valores en savedStateHandle.

Comments are closed.