Kā saglabāt ViewModel stāvokli Android arhitektūras komponentos?
sobes.tech AI
Atbilde no AI
ViewModel stāvokli var saglabāt vairākos veidos:
-
Izmantojot SavedStateHandle: Tas ir ieteicamākais veids, kā saglabāt nelielu datu apjomu, kas nepieciešams stāvokļa atjaunošanai pēc procesa iznīcināšanas.
SavedStateHandlenodrošina Map līdzīgu saskarni datu saglabāšanai un iegūšanai.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) } } -
Stāvokļa saglabāšana bundle (Bundle): Izmanto kopā ar
onSaveInstanceState, lai saglabātuActivityvaiFragmentdatus, nevis tiešiViewModel. Šie dati var tikt izmantotiViewModelinicializācijai tās izveides laikā.// `Activity` vai `Fragment` override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Datu saglabāšana, kas vēlāk tiks izmantoti `ViewModel` inicializācijai outState.putString("some_data_for_vm", " svarīga vērtība") } // Datu izmantošana `ViewModel` (caur fabrika) 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("Nezināma `ViewModel` klase") } } class MyViewModel(private val initialData: String) : ViewModel() { // Datu izmantošana stāvokļa atjaunošanai } -
Datu saglabāšana pastāvīgā glabāšanā: Sarežģītāku vai lielāku datu apjomu gadījumā var izmantot SharedPreferences, datu bāzes (piemēram, Room) vai failus.
ViewModelvar sadarboties ar repozitoriju, kas pārvalda piekļuvi šiem datiem.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Piemērs UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Logika saglabāšanai datu bāzē } fun getUser(id: Long): LiveData<User> { // Logika datu iegūšanai no datu bāzes } }
Izvēlētais metode ir atkarīgs no saglabājamo datu veida un apjoma, kā arī no scenārijiem, kuros nepieciešams atjaunot stāvokli (piemēram, procesa iznīcināšana vai konfigurācijas maiņa). SavedStateHandle ir vispiemērotākais stāvokļa saglabāšanai, kas jāizdzīvo procesa iznīcināšanas gadījumā un jāatjauno UI.