Android arxitektura komponentlərində ViewModel vəziyyətini necə saxlamaq olar?
sobes.tech Süni İntellekt
AI-dan cavab
ViewModel vəziyyətini saxlamaq üçün bir neçə üsul mövcuddur:
-
SavedStateHandle istifadə etmək: Prosessin məhv edilməsindən sonra vəziyyəti bərpa etmək üçün lazım olan kiçik məlumatların saxlanması üçün üstün üsuldur.
SavedStateHandleməlumatların saxlanması və alınması üçün Map-ə bənzər interfeys təmin edir.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) } } -
Vəziyyəti bundle-də (Bundle) saxlamaq:
onSaveInstanceStateilə birlikdə istifadə olunur, özActivityvə yaFragment-in məlumatlarını saxlamaq üçün, birbaşaViewModel-dən deyil. Bu məlumatlarViewModel-in yaradılmasında istifadə oluna bilər.// Activity və ya Fragment-də override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // ViewModel-in başlanğıcı üçün istifadə olunacaq məlumatların saxlanması outState.putString("some_data_for_vm", "əhəmiyyətli dəyər") } // ViewModel-də məlumatların istifadəsi (fabrika vasitəsilə) 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("Naməlum ViewModel sinfi") } } class MyViewModel(private val initialData: String) : ViewModel() { // Vəziyyəti bərpa etmək üçün initialData istifadə olunur } -
Məlumatları daimi yaddaşda saxlamaq: Daha mürəkkəb və ya böyük həcmli məlumatlar üçün SharedPreferences, verilənlər bazası (məsələn, Room) və ya fayllardan istifadə etmək olar.
ViewModelbu məlumatlara giriş üçün repository ilə qarşılıqlı əlaqədə ola bilər.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // UserRepository nümunəsi class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Veritabanına saxlama loqikası } fun getUser(id: Long): LiveData<User> { // Veritabanından alma loqikası } }
Yöntəm seçimi saxlanacaq məlumatın növü və həcminə, eləcə də vəziyyətin bərpası ssenarilərinə bağlıdır (məsələn, prosesin məhv edilməsi vs. konfiqurasiya dəyişməsi). SavedStateHandle prosesin məhv edilməsindən sonra da sağ qalmalı və UI-ni bərpa etməli olan vəziyyətin saxlanması üçün ən uyğundur.