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:
-
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.
SavedStateHandleposkytuje 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) } } -
Uložení stavu do bundle (Bundle): Používá se ve spojení s
onSaveInstanceStatepro uložení dat samotnéhoActivityneboFragment, nikoli přímoViewModel. Tyto data mohou být později použita k inicializaciViewModelpř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 } -
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.
ViewModelmůž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.