Cuando rotas la pantalla de un dispositivo Android, las vistas se destruyen y se reconstruyen por completo. Cualquier variable que hayas definido pierde su valor en ese proceso. Para resolver este problema, Google creó un architecture component llamado ViewModel, una clase diseñada para sobrevivir a los cambios de configuración y manejar el ciclo de vida de los contextos de forma inteligente.
¿Qué es ViewModel y cómo gestiona el ciclo de vida?
El ViewModel es una clase que conoce y delega todos los estados del ciclo de vida de una activity o un fragment: onCreate, onStart, onResume y onPause [0:22]. Cuando el contexto se destruye, ViewModel avisa mediante un método llamado onCleared, que permite limpiar referencias y evitar fugas de memoria.
Si cambias la rotación del dispositivo o el estado del ciclo de vida cambia por cualquier motivo, el ViewModel mantiene los valores intactos. Esto lo convierte en la pieza central de la arquitectura MVVM (Model-View-ViewModel) [0:52].
El flujo funciona así:
La vista se suscribe al ViewModel a través de objetos LiveData.
Cuando los datos cambian en el ViewModel, el LiveData refleja ese cambio hacia la vista.
La vista renderiza la actualización de forma automática.
Los interactors y repositories siguen el mismo patrón de las demás arquitecturas limpias.
¿Cómo crear un ViewModel con LiveData en tu proyecto?
Dentro del paquete correspondiente, se crea una clase que herede de ViewModel, proveniente de la librería AndroidX Lifecycle [1:28]. Al heredar, se obtiene acceso al método onCleared para gestionar la limpieza de recursos.
Se definen dos variables de tipo MutableLiveData que serán los canales de comunicación con la vista [1:48]:
kotlin
class LoansViewModel : ViewModel() {
private val percentageLiveData =MutableLiveData<String>()private val loansListLiveData =MutableLiveData<List<Loan>>()fun getPercentageLiveData():LiveData<String>= percentageLiveData
fun getLoansListLiveData():LiveData<List<Loan>>= loansListLiveData
fun changeValues(){ percentageLiveData.value="100%" loansListLiveData.value=emptyList()}override fun onCleared(){super.onCleared()// limpiar referencias}
}
La función changeValues modifica los valores de cada LiveData. En este ejemplo, establece el porcentaje en 100 % y entrega una lista vacía, simulando que todos los créditos están pagados [2:28].
¿Cómo conectar el ViewModel desde un fragment?
En el fragment, se declara una variable opcional del tipo LoansViewModel con valor inicial nulo. Dentro de onViewCreated, se obtiene la referencia usando ViewModelProviders [2:52]:
¿Cómo observar los cambios del LiveData en la vista?
Una vez obtenida la referencia, se suscriben los observadores pasando el lifecycleOwner para que el ViewModel sepa en qué punto del ciclo de vida se encuentra [3:36]:
El primer observador actualiza el adaptador del RecyclerView con la nueva lista de créditos.
El segundo observador actualiza el texto del porcentaje en pantalla.
Cada vez que se invoque changeValues en el ViewModel, ambos LiveData emiten sus nuevos valores y la vista reacciona automáticamente [4:10].
¿Por qué ViewModel garantiza una arquitectura limpia?
Con este patrón se logra una separación clara de responsabilidades [4:30]:
La capa de presentación queda delegada al ViewModel.
La vista solo renderiza los valores emitidos, sin lógica de negocio.
La conexión con capas de datos (repositories, servicios) se realiza desde el ViewModel.
Esta estructura brinda seguridad frente a los cambios del ciclo de vida y facilita el mantenimiento del código. Si ya trabajas con fragments y activities, integrar ViewModel y LiveData es el paso natural para construir aplicaciones robustas en Android. ¿Ya lo implementaste en tu proyecto? Comparte tu experiencia en los comentarios.