Hoe sla je de staat van ViewModel op in de architectuurcomponenten van Android?
sobes.tech AI
Antwoord van AI
Er zijn verschillende manieren om de toestand van ViewModel op te slaan:
-
Gebruik van SavedStateHandle: De voorkeursmethode voor het opslaan van kleine hoeveelheden gegevens die nodig zijn om de toestand te herstellen na het vernietigen van het proces.
SavedStateHandlebiedt een Map-achtige interface voor het opslaan en ophalen van gegevens.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) } } -
Toestand opslaan in een bundle (Bundle): Wordt gebruikt samen met
onSaveInstanceStateom gegevens van de eigenActivityofFragmentop te slaan, niet direct vanViewModel. Deze gegevens kunnen vervolgens worden gebruikt omViewModelte initialiseren bij het maken ervan.// In Activity of Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Opslaan van gegevens die worden gebruikt om ViewModel te initialiseren outState.putString("some_data_for_vm", "belangrijke waarde") } // Gebruik van gegevens in ViewModel (via een factory) 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("Onbekende ViewModel-klasse") } } class MyViewModel(private val initialData: String) : ViewModel() { // Gebruik van initialData om de toestand te herstellen } -
Gegevens opslaan in permanente opslag: Voor complexere of grotere hoeveelheden gegevens kunnen SharedPreferences, databases (bijvoorbeeld Room) of bestanden worden gebruikt.
ViewModelkan samenwerken met een repository die toegang tot deze gegevens beheert.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Voorbeeld UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Logica voor opslaan in database } fun getUser(id: Long): LiveData<User> { // Logica voor ophalen uit database } }
De keuze van methode hangt af van het type en de omvang van de op te slaan gegevens, evenals van de scenario's voor het herstellen van de toestand (bijvoorbeeld procesvernietiging vs. configuratiewijziging). SavedStateHandle is het meest geschikt voor het opslaan van toestand die de vernietiging van het proces moet overleven en de UI moet herstellen.