SavedStateHandle en MVVM: Haz que tu estado sobreviva siempre de forma sencilla
Antonio Leiva

En Android siempre hemos tenido un par de problemas que son difíciles de gestionar cuando estamos tratando con los ciclos de vida.

El primero es la rotación: cuando rotamos el dispositivo, la Activity es destruida y recreada, y por tanto el estado que hubiéramos almacenado desaparece.

Esto hoy en día es fácil de solucionar utilizando ViewModel, ya que sobrevive a las rotaciones.

El segundo es que que el proceso de la App sea destruido por el sistema porque necesita los recursos para otra cosa. Esto ocurre cuando la App está en segundo plano, y es posible que cuando el usuario vuelva espere encontrarse la App en el estado en que la dejó.

Para este caso, la Activity puede usar el onSavedInstanceState, y almacenar ahí los datos que luego necesite recuperar. Pero si usamos un ViewModel, la comunicación se vuelve muy compleja.

Es por eso que crearon el SavedStateHandle

¿Qué es el SavedStateHandle?

Es un objeto que utilizamos desde el ViewModel y que nos permite gestionar lo que se guarda en este estado sin necesidad de andar comunicándonos con la Activity.

Para ello, lo único que tenemos que hacer es pasar un objeto de esta clase por el constructor del ViewModel:

class MainViewModel(private val state: SavedStateHandle) : 
    ViewModel() {
        ...
}

Después, o bien creamos una factory que extienda de AbstractSavedStateViewModelFactory, o si no lo más sencillo es utilizar el delegado viewModels:

private val vm by viewModels<MainViewModel>()

Esto ya hará todas las conexiones necesarias entre SavedStateHandle y el bundle de onSavedInstanceState, para que nosotros no tengamos que preocuparnos por nada.

Usando SavedStateHandle

Usarlo también es muy fácil. Se trata de una colección de elementos clave/valor a los que podemos acceder como si fuera un mapa, y actualizar sus valores de la misma forma:

private val _count = MutableLiveData(state["count"] ?: 0)
val count: LiveData<Int> get() = _count

fun incrementCount() {
    _count.value = _count.value!! + 1
    state["count"] = _count.value
}

Tiene soporte para LiveData

Pero en realidad podemos simplificar mucho su uso gracias a que podemos crear LiveDatas asociados a claves dentro del estado.

De esta forma, el código es prácticamente equivalente al que usaríamos si nos creáramos nuestros propios LiveData, con la ventaja de que el estado se guarda por si el sistema destruye la App:

private val _count = state.getLiveData("count", 0)
val count: LiveData<Int> get() = _count

¡Un abrazo!

Quizá también te interese…

Text en Jetpack Compose: da vida a tus textos

Text en Jetpack Compose: da vida a tus textos

Los textos son una parte imprescindible en cualquier interfaz de usuario, y por tanto es importante saber cómo usarlos y sacarles el máximo partido. https://youtu.be/yu6rxgBEh1Y En Jetpack Compose, el Composable encargado de renderizar texto se llama simplemente Text...

Modifiers: Personaliza cualquier vista en Jetpack Compose

Modifiers: Personaliza cualquier vista en Jetpack Compose

Muchas veces no nos es suficiente con la configuración básica que nos provee una vista, y por tanto vamos a necesitar modificarla para adaptarla a nuestras necesidades. Esto es exactamente para lo que sirven los Modifiers. Es un cajón de sastre que nos da la opción de...

Layouts en Jetpack Compose: Estructura la UI con Box, Column y Row

Layouts en Jetpack Compose: Estructura la UI con Box, Column y Row

Organizar los elementos de UI en la pantalla siempre es una parte importante, y tenemos los layouts en Jetpack Compose que nos van a permitir hacerlo de distintas formas en función de nuestras necesidades. https://youtu.be/xyBkLS5OPtk Si te fijas, en el artículo...

0 comentarios

Enviar un comentario

Los datos personales que proporciones a través de este formulario quedarán registrados en un fichero de Antonio Leiva Gordillo, con el fin de gestionar los comentarios que realizas en este blog. La legitimación se realiza a través del consentimiento de la parte interesada. Si no se acepta, no podrás comentar en este blog. Los datos que proporciona solo se utilizan para evitar el correo no deseado y no se usarán para nada más. Puede ejercer los derechos de acceso, rectificación, cancelación y oposición en contacto@devexperto.com.

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Acepto la política de privacidad *