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 (Bundle): Използва се в съчетание с onSaveInstanceState за запазване на данните на самия Activity или Fragment, а не директно на ViewModel. Тези данни могат да бъдат използвани за инициализация на ViewModel при създаването й.

    // В Activity или Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Запазване на данни, които ще бъдат използвани за инициализация на ViewModel
        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.