Sobes.tech
Middle

Cum să salvați starea ViewModel în componentele arhitecturale Android?

sobes.tech AI

Răspuns de la AI

Există mai multe moduri de a salva starea ViewModel:

  1. Utilizarea SavedStateHandle: Modul preferat pentru salvarea unor cantități mici de date necesare pentru restaurarea stării după distrugerea procesului. SavedStateHandle oferă o interfață asemănătoare unui Map pentru salvarea și recuperarea datelor.

    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. Salvarea stării într-un bundle (Bundle): Este utilizată împreună cu onSaveInstanceState pentru a salva datele propriului Activity sau Fragment, nu direct ale ViewModel. Apoi, aceste date pot fi folosite pentru inițializarea ViewModel la crearea sa.

    // În Activity sau Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Salvarea datelor care vor fi folosite pentru inițializarea ViewModel
        outState.putString("some_data_for_vm", "valoare importantă")
    }
    
    // Utilizarea datelor în ViewModel (prin fabrică)
    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("Clasă de ViewModel necunoscută")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Utilizarea initialData pentru restaurarea stării
    }
    
  3. Salvarea datelor în stocarea permanentă: Pentru date mai complexe sau de volum mai mare, se pot folosi SharedPreferences, baze de date (de exemplu, Room) sau fișiere. ViewModel poate interacționa cu un depozit care gestionează accesul la aceste date.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Exemplu de UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logica de salvare în baza de date
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logica de preluare din baza de date
        }
    }
    

Alegerea metodei depinde de tipul și volumul datelor de salvat, precum și de scenariile de restaurare a stării (de exemplu, distrugerea procesului vs. schimbarea configurației). SavedStateHandle este cea mai potrivită pentru salvarea stării care trebuie să supraviețuiască distrugerii procesului și să refacă UI-ul.