Sobes.tech
Middle

Come salvare lo stato di ViewModel nei componenti architetturali di Android?

sobes.tech AI

Risposta dell'AI

È possibile salvare lo stato di ViewModel in diversi modi:

  1. Utilizzo di SavedStateHandle: Il metodo preferito per salvare piccole quantità di dati necessari per ripristinare lo stato dopo la distruzione del processo. SavedStateHandle fornisce un'interfaccia simile a una mappa per salvare e recuperare i dati.

    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. Salvataggio dello stato in un bundle (Bundle): Viene utilizzato insieme a onSaveInstanceState per salvare i dati dell'Activity o del Fragment stesso, non direttamente di ViewModel. Questi dati possono poi essere usati per inizializzare ViewModel al momento della sua creazione.

    // In Activity o Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Salvataggio dei dati che saranno usati per inizializzare ViewModel
        outState.putString("some_data_for_vm", "valore importante")
    }
    
    // Uso dei dati in ViewModel (tramite una factory)
    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 di ViewModel sconosciuta")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Uso di initialData per ripristinare lo stato
    }
    
  3. Salvataggio dei dati in memoria persistente: Per dati più complessi o di grandi dimensioni, si può usare SharedPreferences, database (ad esempio, Room) o file. ViewModel può interagire con un repository che gestisce l'accesso a questi dati.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Esempio di UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logica di salvataggio nel database
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logica di recupero dal database
        }
    }
    

La scelta del metodo dipende dal tipo e dalla quantità di dati da salvare, nonché dagli scenari di ripristino dello stato che si devono supportare (ad esempio, distruzione del processo vs cambio di configurazione). SavedStateHandle è il metodo più adatto per salvare lo stato che deve sopravvivere alla distruzione del processo e ripristinare l'interfaccia utente.