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:
-
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.
SavedStateHandleposkytuje 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) } } -
Uloženie stavu do balíka (Bundle): Používa sa v spojení s
onSaveInstanceStatena uloženie dát samotnéhoActivityaleboFragment, nie priamoViewModel. Tieto dáta môžu byť neskôr použité na inicializáciuViewModelpri 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 } -
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.
ViewModelmôž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.