Sobes.tech
Junior

Parlez de Jetpack ViewModel.

sobes.tech IA

Réponse de l'IA

ViewModel est un composant de Jetpack conçu pour stocker et gérer les données de manière liée à l’interface utilisateur. Son objectif principal est de conserver les données de l’UI lors de changements de configuration, comme la rotation de l’écran, et de survivre au cycle de vie de l’Activity ou du Fragment.

Caractéristiques de ViewModel :

  • Stockage des données : Survive aux changements de configuration et même à la destruction de l’Activity/Fragment, en restaurant les données lors de la recréation.
  • Séparation de la logique : Sépare la logique de préparation des données pour l’UI de l’UI elle-même (Activity/Fragment).
  • Lié au cycle de vie : Associé au cycle de vie de l’Activity ou du Fragment.
  • Prévention des fuites de mémoire : Ne maintient pas de références directes à View, Lifecycle ou Activity/Fragment, ce qui empêche les fuites.

Comment l’utiliser :

  1. Créez une classe héritant de ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Initialisation des données
        }
    
        fun fetchData() {
            // Logique de chargement des données
            _data.value = "Données chargées"
        }
    
        override fun onCleared() {
            // Nettoyage des ressources
            super.onCleared()
        }
    }
    
  2. Obtenez une instance de ViewModel dans une Activity ou un Fragment.

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    
            viewModel.data.observe(this, Observer { newData ->
                // Mise à jour de l’UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Utilisez ViewModelProvider.Factory pour créer des instances de ViewModel avec des dépendances.

    class MyViewModel(private val repository: MyRepository) : ViewModel() {
        // ...
    }
    
    class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(repository) as T
            }
            throw IllegalArgumentException("Classe ViewModel inconnue")
        }
    }
    
    // Dans l’Activity/Fragment
    // val repository = MyRepository() // Injection de dépendance
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Comparaison avec onSaveInstanceState() :

Caractéristique ViewModel onSaveInstanceState()
Survie aux changements de configuration Oui Oui (pour petites quantités de données)
Survie au processus Non (les données sont perdues après la destruction du processus) Oui (pour petites quantités de données)
Stockage des données Objets, LiveData Bundle (primitifs, Serializable, Parcelable)
Fuites de mémoire Non (si utilisé correctement) Possible si des références à Activity/View sont maintenues
Complexité de mise en œuvre Plus complexe pour scénarios simples Plus simple pour scénarios simples

ViewModel aide à créer des applications plus résistantes et faciles à tester, en séparant l’UI de la logique de traitement des données.