Sobes.tech
Middle

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:

  1. 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. SavedStateHandle fournit 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)
        }
    }
    
  2. Sauvegarde de l'état dans un bundle (Bundle): Utilisé avec onSaveInstanceState pour sauvegarder les données de l'Activity ou du Fragment lui-même, pas directement du ViewModel. Ces données peuvent ensuite être utilisées pour initialiser le ViewModel lors 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
    }
    
  3. 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. ViewModel peut 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.