Sobes.tech
Middle

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:

  1. 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. SavedStateHandle mə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)
        }
    }
    
  2. Vəziyyəti bundle-də (Bundle) saxlamaq: onSaveInstanceState ilə birlikdə istifadə olunur, öz Activity və ya Fragment-in məlumatlarını saxlamaq üçün, birbaşa ViewModel-dən deyil. Bu məlumatlar ViewModel-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
    }
    
  3. 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. ViewModel bu 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.