Sobes.tech
Middle

Ako uložiť stav ViewModel v architektonických komponentoch Androidu?

sobes.tech AI

Odpoveď od AI

Uložiť stav ViewModel je možné niekoľkými spôsobmi:

  1. Použitie SavedStateHandle: Preferovaný spôsob na uloženie malého množstva dát, ktoré sú potrebné na obnovenie stavu po zničení procesu. SavedStateHandle poskytuje rozhranie podobné Mapu na uloženie a načítanie dát.

    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. Uloženie stavu do balíka (Bundle): Používa sa v spojení s onSaveInstanceState na uloženie dát samotného Activity alebo Fragment, nie priamo ViewModel. Tieto dáta môžu byť neskôr použité na inicializáciu ViewModel pri jej vytvorení.

    // V Activity alebo Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Uloženie dát, ktoré budú neskôr použité na inicializáciu ViewModel
        outState.putString("some_data_for_vm", "dôležitá hodnota")
    }
    
    // Použitie dát vo ViewModel (cez továreň)
    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("Neznáma trieda ViewModel")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Použitie initialData na obnovenie stavu
    }
    
  3. Uloženie dát do trvalého úložiska: Pre zložitejšie alebo väčšie objemy dát je možné použiť SharedPreferences, databázy (napríklad Room) alebo súbory. ViewModel môže komunikovať s repository, ktorý spravuje prístup k týmto dátam.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Príklad UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logika uloženia do databázy
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logika načítania z databázy
        }
    }
    

Voľba metódy závisí od typu a objemu ukladaných dát, ako aj od scénarov na obnovenie stavu (napríklad zničenie procesu vs. zmena konfigurácie). SavedStateHandle je najvhodnejší na uloženie stavu, ktorý musí prežiť zničenie procesu a umožniť obnovenie UI.