Comment sauvegarder l'état de ViewModel dans les composants architecturaux d'Android?
sobes.tech IA
Réponse de l'IA
Il existe plusieurs façons de sauvegarder l'état de ViewModel:
-
Utilisation de SavedStateHandle: La méthode préférée pour sauvegarder de petites quantités de données nécessaires pour restaurer l'état après la destruction du processus.
SavedStateHandlefournit une interface semblable à une carte pour sauvegarder et récupérer des données.class MyViewModel(private val state: SavedStateHandle) : ViewModel() { private val _name = state.getLiveData<String>("name") val name: LiveData<String> = _name fun saveName(newName: String) { state.set("name", newName) } } -
Sauvegarde de l'état dans un bundle (Bundle): Utilisé avec
onSaveInstanceStatepour sauvegarder les données de l'Activityou duFragmentlui-même, pas directement duViewModel. Ces données peuvent ensuite être utilisées pour initialiser leViewModellors de sa création.// Dans l'Activity ou le Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Sauvegarder les données qui seront utilisées pour initialiser le ViewModel outState.putString("some_data_for_vm", "valeur importante") } // Utilisation des données dans le ViewModel (via une fabrique) class MyViewModelFactory(private val initialData: String) : ViewModelProvider.Factory { override fun <T : ViewModel?> create(modelClass: Class<T>): T { if (modelClass.isAssignableFrom(MyViewModel::class.java)) { @Suppress("UNCHECKED_CAST") return MyViewModel(initialData) as T } throw IllegalArgumentException("Classe de ViewModel inconnue") } } class MyViewModel(private val initialData: String) : ViewModel() { // Utilisation de initialData pour restaurer l'état } -
Sauvegarde des données dans un stockage permanent: Pour sauvegarder des données plus complexes ou volumineuses, on peut utiliser SharedPreferences, des bases de données (par exemple, Room) ou des fichiers.
ViewModelpeut interagir avec un dépôt qui gère l'accès à ces données.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Exemple de UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Logique de sauvegarde dans la base de données } fun getUser(id: Long): LiveData<User> { // Logique de récupération depuis la base de données } }
Le choix de la méthode dépend du type et du volume de données à sauvegarder, ainsi que des scénarios de restauration d'état à prendre en charge (par exemple, destruction du processus vs changement de configuration). SavedStateHandle est le plus adapté pour sauvegarder l'état qui doit survivre à la destruction du processus et restaurer l'UI.