Sobes.tech
Junior

Parlez-moi du modèle MVVM.

sobes.tech IA

Réponse de l'IA

Le modèle-Vue-ViewModel (MVVM) est un patron architectural qui sépare l'interface utilisateur (Vue) de la logique métier (Modèle) à l'aide d'un intermédiaire : le ViewModel.

  • Modèle : Représente les données et la logique métier de l'application. Ne contient aucune logique spécifique à l'UI.
  • Vue : Affiche les données du ViewModel et envoie les actions de l'utilisateur (par exemple, clics sur des boutons) au ViewModel. Ne contient pas de logique métier, seulement la logique d'affichage.
  • ViewModel : Sert de lien. Fournit les données du Modèle à la Vue dans un format adapté à l'affichage et traite les requêtes de la Vue, en mettant à jour le Modèle. Contient la logique de présentation, mais ne manipule pas directement la Vue. Utilise souvent LiveData ou StateFlow pour des mises à jour réactives.

Avantages :

  • Séparation des responsabilités : Améliore la lisibilité et la maintenabilité du code.
  • Testabilité : Le ViewModel est facile à tester isolément, car il ne dépend pas de l'API Android.
  • Support de la survie : Le ViewModel survit aux changements de configuration (par exemple, rotation de l'écran) et évite de recharger les données.
  • Modularité améliorée.

Exemple de structure :

// Modèle (exemple de dépôt)
class UserRepository {
    fun getUsers(): List<User> {
        // ... logique pour obtenir des utilisateurs ...
        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()
    }
}

// Vue (Fragment/Activity)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Utilisation du délégué Android KTX

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

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // Mise à jour de l'UI (par exemple, adapter RecyclerView)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // Logique de mise à jour TextView, RecyclerView, etc.
    }
}