Sobes.tech
Middle

Kako sačuvati stanje ViewModel u arhitektonskim komponentama Androida?

sobes.tech АИ

Одговор од АИ

Sadržaj ViewModel-a može se sačuvati na nekoliko načina:

  1. Korišćenje SavedStateHandle: Preferirani način za čuvanje malih količina podataka koje su potrebne za obnavljanje stanja nakon uništenja procesa. SavedStateHandle pruža interfejs sličan mapi za čuvanje i dobijanje podataka.

    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. Čuvanje stanja u bundle (Bundle): Koristi se u kombinaciji sa onSaveInstanceState za čuvanje podataka same Activity ili Fragment, a ne direktno ViewModel. Ovi podaci mogu biti korišćeni za inicijalizaciju ViewModel pri njenom kreiranju.

    // U Activity ili Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Čuvanje podataka koji će kasnije biti korišćeni za inicijalizaciju ViewModel
        outState.putString("some_data_for_vm", "važna vrednost")
    }
    
    // Korišćenje podataka u ViewModel (kroz fabriku)
    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("Nepoznata klasa ViewModel")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Korišćenje initialData za obnavljanje stanja
    }
    
  3. Čuvanje podataka u trajno skladište: Za složenije ili veće količine podataka, može se koristiti SharedPreferences, baze podataka (npr. Room) ili fajlovi. ViewModel može komunicirati sa repozitorijumom koji upravlja pristupom tim podacima.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Primer UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logika za čuvanje u bazu podataka
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logika za dobijanje iz baze podataka
        }
    }
    

Izbor metode zavisi od tipa i obima podataka koje treba sačuvati, kao i od scenarija za obnavljanje stanja (npr. uništavanje procesa vs. promena konfiguracije). SavedStateHandle je najpogodniji za čuvanje stanja koje treba preživeti uništavanje procesa i omogućiti obnavljanje UI-ja.