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.
}
}