Sobes.tech
Middle

Android arxitektura komponentlarida ViewModel holatini qanday saqlash mumkin?

sobes.tech AI

AIdan javob

ViewModel holatini bir necha usul bilan saqlash mumkin:

  1. SavedStateHandle dan foydalanish: Jarayonning buzilishidan keyin holatni tiklash uchun zarur bo'lgan kichik ma'lumotlarni saqlash uchun afzal ko'rilgan usul. SavedStateHandle ma'lumotlarni saqlash va olish uchun Map-ga o'xshash interfeys taqdim etadi.

    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. Bundle (Bundle) ichida holatni saqlash: onSaveInstanceState bilan birga ishlatiladi, o'zining Activity yoki Fragment ma'lumotlarini saqlash uchun, to'g'ridan-to'g'ri ViewModel emas. Bu ma'lumotlar ViewModelni yaratishda foydalanilishi mumkin.

    // Activity yoki Fragmentda
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // ViewModelni boshlash uchun foydalaniladigan ma'lumotlarni saqlash
        outState.putString("some_data_for_vm", "muhim qiymat")
    }
    
    // ViewModelda ma'lumotlardan foydalanish (fabrika orqali)
    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("Noma'lum ViewModel sinfi")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Holatni tiklash uchun initialData dan foydalanish
    }
    
  3. Ma'lumotlarni doimiy saqlash joyiga saqlash: Murakkab yoki katta hajmdagi ma'lumotlar uchun SharedPreferences, ma'lumotlar bazalari (masalan, Room) yoki fayllardan foydalanish mumkin. ViewModel bu ma'lumotlarga kirishni boshqaradigan repository bilan hamkorlik qilishi mumkin.

    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 misoli
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Ma'lumotlar bazasiga saqlash logikasi
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Ma'lumotlar bazasidan olish logikasi
        }
    }
    

Usul tanlovi saqlanadigan ma'lumotning turi va hajmiga, shuningdek, qanday holatni tiklash scenariyalarini qo'llab-quvvatlashga bog'liq (masalan, jarayonning buzilishi yoki konfiguratsiya o'zgarishi). SavedStateHandle jarayon buzilishidan keyin ham saqlanadigan va UI-ni tiklash uchun eng mos usul hisoblanadi.