Gruki Logo

Gruki - Documentación de Programación

Kotlin

MVVM en Kotlin: Una Guía Súper Fácil para Entenderlo

Aprende MVVM en Kotlin de forma sencilla. Descubre cómo organizar tu código para crear aplicaciones más limpias, fáciles de mantener y testear. ¡Con ejemplos cotidianos para que lo entiendas como un niño!

Imagina que estás construyendo una casa con bloques de LEGO. En lugar de juntar todos los bloques al azar, MVVM es como tener un plan detallado que te dice dónde va cada bloque. Te ayuda a organizar tu código de Kotlin para que sea más fácil construir y mantener tu aplicación.

MVVM significa Model-View-ViewModel. Cada parte tiene una tarea específica, como los diferentes equipos en una obra de construcción. El 'Modelo' es como el diseño de la casa, la 'Vista' es lo que realmente ves construido, y el 'ViewModel' es el jefe de obra que le dice a cada equipo qué hacer.

El Modelo: ¡Los Datos y la Lógica del Negocio!

El Modelo es como los ladrillos, la madera y otros materiales de construcción. Almacena los datos de tu aplicación (por ejemplo, una lista de tareas pendientes) y se encarga de la lógica del negocio (por ejemplo, cómo agregar una nueva tarea o marcar una como completada).

Imagina que tienes una aplicación para hacer la lista de compras. El Modelo guardaría la lista de productos que necesitas comprar y se encargaría de agregar o eliminar productos de esa lista.

Puntos importantes:

  • El Modelo no sabe nada sobre la interfaz de usuario (la 'Vista'). Sólo se preocupa por los datos y cómo manipularlos.
  • Puede ser una base de datos, un archivo JSON, o incluso simplemente una lista en memoria.

La Vista: ¡Lo Que el Usuario Ve y Toca!

La Vista es como la fachada de la casa, los colores de las paredes, los muebles, etc. Es lo que el usuario ve y con lo que interactúa en la pantalla. Por ejemplo, botones, campos de texto, listas, etc.

Siguiendo con el ejemplo de la lista de compras, la Vista sería la pantalla donde ves la lista de productos, los botones para agregar o eliminar productos, y los campos de texto donde escribes el nombre de los productos.

Puntos importantes:

  • La Vista es 'tonta'. No sabe cómo obtener los datos ni cómo manipularlos. Sólo sabe cómo mostrar la información que le da el ViewModel.
  • En Android, la Vista suele ser una Activity o un Fragment.

El ViewModel: ¡El Jefe de Obra!

El ViewModel es el jefe de obra. Actúa como un intermediario entre la Vista y el Modelo. Obtiene los datos del Modelo, los prepara para mostrarlos en la Vista, y responde a las acciones del usuario en la Vista.

Volviendo al ejemplo de la lista de compras, el ViewModel le dice al Modelo que agregue un nuevo producto a la lista cuando el usuario presiona el botón 'Agregar'. Luego, obtiene la lista actualizada del Modelo y se la da a la Vista para que la muestre.

Puntos importantes:

  • El ViewModel no sabe nada sobre la Vista específica. Puede funcionar con diferentes Vistas sin necesidad de cambiar.
  • El ViewModel expone 'estados' que la Vista observa para actualizarse automáticamente cuando los datos cambian. Esto se hace comúnmente con LiveData o StateFlow en Kotlin.

Un Ejemplo Sencillo de MVVM en Kotlin

Imagina que tienes una aplicación que muestra un mensaje de saludo. El Modelo guarda el mensaje, la Vista muestra el mensaje en una etiqueta, y el ViewModel obtiene el mensaje del Modelo y se lo da a la Vista.

Vamos a crear un ejemplo simplificado en Kotlin.

Ejemplos de Código

Modelo que guarda el mensaje de saludo.

Lenguaje: Kotlin
kotlin

Explicación del código:

  1. Línea 1: `class SaludoModel {` Define la clase `SaludoModel` que actuará como nuestro modelo.
  2. Línea 2: `private val mensaje = "¡Hola Mundo!"` Declara una variable privada e inmutable llamada `mensaje` que contiene el saludo.
  3. Línea 3: `fun obtenerSaludo(): String {` Define una función llamada `obtenerSaludo` que devuelve un String.
  4. Línea 4: `return mensaje` La función regresa el valor del mensaje.
  5. Línea 5: `}` Cierra la función `obtenerSaludo` y la clase `SaludoModel`.

ViewModel que obtiene el saludo del modelo y lo expone para la vista.

Lenguaje: Kotlin
kotlin

Explicación del código:

  1. Línea 1: `import androidx.lifecycle.LiveData` Importa la clase LiveData de Android Architecture Components.
  2. Línea 2: `import androidx.lifecycle.MutableLiveData` Importa la clase MutableLiveData, una versión modificable de LiveData.
  3. Línea 3: `import androidx.lifecycle.ViewModel` Importa la clase ViewModel.
  4. Línea 4: `class SaludoViewModel : ViewModel() {` Define la clase SaludoViewModel que hereda de ViewModel.
  5. Línea 5: `private val modelo = SaludoModel()` Crea una instancia del modelo `SaludoModel`.
  6. Línea 6: `private val _saludo = MutableLiveData<String>()` Crea un LiveData interno y mutable para el saludo. El _ prefijo indica que es privado.
  7. Línea 7: `val saludo: LiveData<String> = _saludo` Expone el LiveData para que la Vista pueda observarlo. Es inmutable desde la Vista.
  8. Línea 8: `init {` Bloque de inicialización de la clase.
  9. Línea 9: `_saludo.value = modelo.obtenerSaludo()` Obtiene el saludo del modelo y lo asigna al LiveData. Esto notifica a los observadores (la Vista) que hay un nuevo valor.
  10. Línea 10: `}` Cierra el bloque `init` y la clase `SaludoViewModel`.

Ejemplo de una vista muy simple (podría ser un Fragment o Activity) que observa el LiveData del ViewModel y muestra el saludo.

Lenguaje: Kotlin
kotlin

Explicación del código:

  1. Línea 1: Los imports necesarios para usar ViewModel, LiveData, TextView, etc.
  2. Línea 2: `class MainActivity : AppCompatActivity() {` Define la clase MainActivity que hereda de AppCompatActivity.
  3. Línea 3: `private lateinit var saludoTextView: TextView` Declara una variable lateinit para el TextView que mostrará el saludo.
  4. Línea 4: `private lateinit var saludoViewModel: SaludoViewModel` Declara una variable lateinit para el ViewModel.
  5. Línea 5: `override fun onCreate(savedInstanceState: Bundle?) {` Sobrescribe la función onCreate.
  6. Línea 6: `super.onCreate(savedInstanceState)` Llama a la función onCreate de la clase padre.
  7. Línea 7: `setContentView(R.layout.activity_main)` Infla el layout de la actividad.
  8. Línea 8: `saludoTextView = findViewById(R.id.saludo_text_view)` Obtiene una referencia al TextView del layout.
  9. Línea 9: `saludoViewModel = ViewModelProvider(this).get(SaludoViewModel::class.java)` Obtiene una instancia del ViewModel.
  10. Línea 10: `saludoViewModel.saludo.observe(this, Observer {` Observa el LiveData `saludo` del ViewModel.
  11. Línea 11: ` saludoTextView.text = it` Actualiza el TextView con el nuevo valor del LiveData.
  12. Línea 12: ` })` Cierra el observador.
  13. Línea 13: ` }` Cierra la funcion onCreate.
  14. Línea 14: `}` Cierra la class MainActivity.

Recursos relacionados

Explora más contenido relacionado con MVVM en Kotlin para profundizar tus conocimientos.