Sobes.tech
Middle

Jak uložit stav ViewModel v architektonických komponentách Androidu?

sobes.tech AI

Odpověď od AI

Uložit stav ViewModel několika způsoby:

  1. Použití SavedStateHandle: Preferovaný způsob pro uložení malého množství dat, které jsou potřebné k obnovení stavu po zničení procesu. SavedStateHandle poskytuje rozhraní podobné Mapě pro ukládání a načítání dat.

    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žení stavu do bundle (Bundle): Používá se ve spojení s onSaveInstanceState pro uložení dat samotného Activity nebo Fragment, nikoli přímo ViewModel. Tyto data mohou být později použita k inicializaci ViewModel při jejím vytvoření.

    // V Activity nebo Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Uložení dat, která budou později použita k inicializaci ViewModel
        outState.putString("some_data_for_vm", "důležitá hodnota")
    }
    
    // Použití dat ve ViewModel (přes továrnu)
    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ámá třída ViewModel")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Použití initialData pro obnovení stavu
    }
    
  3. Uložení dat do trvalého úložiště: Pro uložení složitějších nebo větších objemů dat lze použít SharedPreferences, databáze (například Room) nebo soubory. ViewModel může komunikovat s repository, který spravuje přístup k těmto datům.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Příklad UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logika uložení do databáze
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logika načítání z databáze
        }
    }
    

Volba metody závisí na typu a objemu ukládaných dat, stejně jako na scénářích obnovení stavu, které je třeba podporovat (například zničení procesu vs. změna konfigurace). SavedStateHandle je nejvhodnější pro uložení stavu, který musí přežít zničení procesu a umožnit obnovení UI.