Kaip išsaugoti ViewModel būseną Android architektūros komponentuose?
sobes.tech AI
Atsakymas iš AI
ViewModel būseną galima išsaugoti keliais būdais:
-
Naudojant SavedStateHandle: Tai yra pageidaujamas būdas išsaugoti mažą duomenų kiekį, kuris reikalingas būsenos atkūrimui po proceso sunaikinimo.
SavedStateHandlesuteikia Map panašų sąsają duomenų saugojimui ir gavimui.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) } } -
Būsenos išsaugojimas bundle (Bundle): Naudojama kartu su
onSaveInstanceState, kad išsaugotųActivityarbaFragmentduomenis, o ne tiesiogiaiViewModel. Šie duomenys gali būti naudojamiViewModelinicializacijai jos sukūrimo metu.// Activity arba Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Duomenų išsaugojimas, kurie vėliau bus naudojami `ViewModel` inicializacijai outState.putString("some_data_for_vm", " svarbi reikšmė") } // Duomenų naudojimas `ViewModel` (per fabriką) 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("Nežinoma `ViewModel` klasė") } } class MyViewModel(private val initialData: String) : ViewModel() { // Naudojant initialData būsenos atkūrimui } -
Duomenų išsaugojimas nuolatiniame saugykloje: Sudėtingesnių ar didesnių duomenų atveju galima naudoti SharedPreferences, duomenų bazes (pvz., Room) arba failus.
ViewModelgali sąveikauti su repository, kuris valdo prieigą prie šių duomenų.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Pavyzdys UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Logika išsaugojimui duomenų bazėje } fun getUser(id: Long): LiveData<User> { // Logika duomenų gavimui iš duomenų bazės } }
Pasirinktas metodas priklauso nuo saugomų duomenų tipo ir kiekio, taip pat nuo scenarijų, kuriuose reikia atkurti būseną (pvz., proceso sunaikinimas vs. konfigūracijos keitimas). SavedStateHandle yra tinkamiausias būdas išsaugoti būseną, kuri turi išlikti po proceso sunaikinimo ir leisti atkurti UI.