Sobes.tech
Middle

Чӣ гуна ҳолати ViewModel-ро дар компонентҳои меъмории Android нигоҳ доштани мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Мазмуни ҳолати ViewModel чанд роҳҳои зеринро дорад:

  1. Истифодаи SavedStateHandle: Роҳи беҳтарин барои нигоҳ доштани миқдори ками маълумотҳо, ки барои барқарор кардани ҳолат пас аз нобуд кардани раванди кор истифода мешавад. SavedStateHandle интерфейси монанд ба харита барои нигоҳ доштани маълумот ва гирифтани он медиҳад.

    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): Дар ҳамоҳангӣ бо onSaveInstanceState барои нигоҳ доштани маълумоти Activity ё Fragment истифода мешавад, на мустақиман ViewModel. Ин маълумот метавонад барои оғозёбӣ ё барқарор кардани ViewModel пас аз эҷод истифода шавад.

    // Дар Activity ё Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Нигоҳдории маълумот, ки баъдан барои оғозёбӣ истифода мешавад
        outState.putString("some_data_for_vm", "арзиши муҳим")
    }
    
    // Истифодаи маълумот дар ViewModel (бо фабрика)
    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("Таснифи ViewModel номаълум")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Истифодаи initialData барои барқарор кардани ҳолат
    }
    
  3. Нигоҳдории маълумот дар захираҳои доимӣ: Барои маълумоти мураккаб ё калонтар, метавон истифода бурд SharedPreferences, базаи додаҳо (масалан, Room) ё файлҳо. ViewModel метавонад бо репозитории ҳамкорӣ кунад, ки дастрасиро ба ин маълумотҳо идора мекунад.

    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
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Логикаи нигоҳдорӣ дар базаи додаҳо
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Логикаи гирифтани маълумот аз базаи додаҳо
        }
    }
    

Интихоби усул вобаста ба навъи ва миқдори маълумотҳое, ки бояд нигоҳ дошта шаванд, ва сценарийҳои барқарор кардани ҳолат (масалан, нобуд кардани раванди кор ё тағироти конфигуратсия). SavedStateHandle беҳтарин барои нигоҳ доштани ҳолате мебошад, ки бояд пас аз нобуд кардани раванди кор боқӣ монад ва UI-ро барқарор кунад.