¿Qué es MVVM y por qué usarlo en Android Studio?
MVVM (Model-View-ViewModel) es un patrón de arquitectura diseñado para separar la lógica de negocio de la interfaz gráfica en aplicaciones. En Android, este patrón ayuda a organizar el código en tres capas:
Model, que gestiona los datos y la lógica de negocio.
View, que representa la interfaz de usuario (Activity, Fragment).
ViewModel, que actúa como intermediario entre la vista y el modelo, manteniendo el estado y la lógica de presentación.
Esta separación permite que cada componente tenga responsabilidades claras, lo que facilita el mantenimiento y la escalabilidad del proyecto.
Usar MVVM en Android ofrece varias ventajas:
Mejor organización del código: evita que la lógica se mezcle con la interfaz.
Compatibilidad con el ciclo de vida: los ViewModels están diseñados para sobrevivir a cambios de configuración como rotaciones de pantalla.
Facilita pruebas unitarias: al desacoplar la lógica de la UI, es más sencillo probar el comportamiento de la aplicación.
Escalabilidad y mantenibilidad: ideal para proyectos grandes donde se necesita modularidad.
Integración con librerías modernas: como LiveData, Flow y Data Binding, que permiten una comunicación reactiva entre la vista y el ViewModel
Componentes del MVVM
Model, View, ViewModel
Model. En el patrón MVVM, el Model representa la capa encargada de la lógica de negocio y la gestión de datos. Es responsable de obtener, procesar y proporcionar la información que necesita la aplicación, ya sea desde una base de datos local, una API remota o cualquier otra fuente. El Model no tiene conocimiento de la interfaz gráfica (View) ni de cómo se muestran los datos; su función es mantener la aplicación desacoplada y facilitar la reutilización y testabilidad del código.
View. En el patrón MVVM, la View es la capa encargada de mostrar la interfaz gráfica y recibir la interacción del usuario. Su función principal es presentar los datos que provienen del ViewModel y reflejar los cambios en la UI sin contener lógica de negocio. En Android, la View suele estar representada por Activity, Fragment o componentes de UI, y se apoya en mecanismos como Data Binding o View Binding para enlazar los datos de forma reactiva. La View no debe manipular directamente el modelo, sino comunicarse con el ViewModel, manteniendo así una separación clara de responsabilidades.
ViewModel. El ViewModel es el componente que actúa como intermediario entre la vista (Activity/Fragment) y el modelo. Su principal función es gestionar y preparar los datos para la interfaz de usuario, asegurando que la lógica de negocio no se mezcle con la lógica de presentación. Además, el ViewModel está diseñado para sobrevivir a cambios de configuración, como rotaciones de pantalla, evitando que se pierdan los datos. Normalmente se combina con LiveData o StateFlow para observar cambios y actualizar la UI de forma reactiva.
Práctica
Para probar el MVVM, vamos a crear un nuevo proyecto en android studio:
Hasta este punto, vamos a crear diversos archivos, coloca la vista como android y estructura de la siguiente forma.
recuerda colocar a "fi.ng" en la carpeta drawable.
Para el MainActivity.kt
Para el LoginScreen.kt
Para LoginViewModel.kt
En este proyecto se está implementando el patrón MVVM (Model-View-ViewModel) de manera clara y moderna usando Jetpack Compose y LiveData. La View está representada por los Composables (LoginScreen, EmailField, passwordField, LoginButton, etc.), que son responsables únicamente de mostrar la interfaz y reaccionar a cambios de estado. Estos Composables no contienen lógica de negocio; en su lugar, observan el estado expuesto por el ViewModel mediante observeAsState(), lo que permite que la UI se actualice automáticamente cuando cambian los datos. El ViewModel (LoginViewModel) actúa como intermediario entre la vista y el modelo, gestionando el estado de los campos (email, password), validando las entradas con funciones como isValidEmail() y isValidPassword(), y controlando la habilitación del botón de login mediante loginEnable. Además, maneja el flujo de login simulado con corrutinas (delay(4000)), actualizando el estado isLoading para mostrar un CircularProgressIndicator en la UI mientras se procesa la acción. El Model en este caso es mínimo, ya que no hay una capa de datos real, pero el ViewModel encapsula la lógica que normalmente interactuaría con repositorios o servicios externos. Gracias a esta separación, la UI no necesita saber cómo se valida el email ni cómo se realiza el login; solo reacciona a los cambios del ViewModel. Esto asegura una arquitectura escalable, fácil de mantener y testear, donde cada capa tiene responsabilidades bien definidas: la vista muestra datos, el ViewModel gestiona lógica y estado, y el modelo provee datos. Además, el uso de rememberCoroutineScope() en la vista para disparar acciones asincrónicas sin bloquear la UI refuerza la naturaleza reactiva del patrón. En resumen, este ejemplo demuestra cómo MVVM y Compose trabajan juntos para crear una interfaz declarativa, reactiva y desacoplada, cumpliendo con las mejores prácticas modernas de Android.
Android -MVVM con Jetpack Compose-