Sobes.tech
Junior

Háblame del patrón MVVM.

sobes.tech AI

Respuesta de la IA

El Modelo-Vista-Modelo de Vista (MVVM) es un patrón arquitectónico que separa la interfaz de usuario (Vista) de la lógica de negocio (Modelo) mediante un intermediario: el Modelo de Vista (ViewModel).

  • Modelo: Representa los datos y la lógica de negocio de la aplicación. No contiene lógica específica de la interfaz de usuario.
  • Vista: Muestra los datos del ViewModel y envía acciones del usuario (por ejemplo, pulsaciones de botones) al ViewModel. No contiene lógica de negocio, solo lógica de presentación.
  • ViewModel: Actúa como un enlace. Proporciona datos del Modelo para la Vista en un formato adecuado para mostrar y procesa las solicitudes de la Vista, actualizando el Modelo. Contiene la lógica de presentación, pero no manipula directamente la Vista. Frecuentemente usa LiveData o StateFlow para actualizaciones reactivas de la Vista.

Ventajas:

  • Separación de responsabilidades: Mejora la legibilidad y mantenibilidad del código.
  • Testabilidad: El ViewModel es fácil de probar en aislamiento, ya que no depende de la API de Android.
  • Soporte para la supervivencia: El ViewModel sobrevive a cambios de configuración (por ejemplo, rotación de pantalla) y evita volver a obtener datos.
  • Mejora en la modularidad.

Ejemplo de estructura:

// Modelo (repositorio de ejemplo)
class UserRepository {
    fun getUsers(): List<User> {
        // ... lógica para obtener usuarios ...
        return listOf(User("Alice"), User("Bob"))
    }
}

// ViewModel
class UserViewModel(private val repository: UserRepository) : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users

    init {
        loadUsers()
    }

    private fun loadUsers() {
        _users.value = repository.getUsers()
    }
}

// Vista (Fragmento/Actividad)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Uso del delegado de Android KTX

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Actualización de la interfaz de usuario (por ejemplo, adaptador RecyclerView)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Lógica para actualizar TextView, RecyclerView, etc.
    }
}