Kako sačuvati stanje ViewModel u arhitektonskim komponentama Androida?
sobes.tech АИ
Одговор од АИ
Sadržaj ViewModel-a može se sačuvati na nekoliko načina:
-
Korišćenje SavedStateHandle: Preferirani način za čuvanje malih količina podataka koje su potrebne za obnavljanje stanja nakon uništenja procesa.
SavedStateHandlepruž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) } } -
Čuvanje stanja u bundle (Bundle): Koristi se u kombinaciji sa
onSaveInstanceStateza čuvanje podataka sameActivityiliFragment, a ne direktnoViewModel. Ovi podaci mogu biti korišćeni za inicijalizacijuViewModelpri 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 } -
Č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.
ViewModelmož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.