Sobes.tech
Middle

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:

  1. 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. SavedStateHandle biedt 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)
        }
    }
    
  2. Toestand opslaan in een bundle (Bundle): Wordt gebruikt samen met onSaveInstanceState om gegevens van de eigen Activity of Fragment op te slaan, niet direct van ViewModel. Deze gegevens kunnen vervolgens worden gebruikt om ViewModel te 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
    }
    
  3. Gegevens opslaan in permanente opslag: Voor complexere of grotere hoeveelheden gegevens kunnen SharedPreferences, databases (bijvoorbeeld Room) of bestanden worden gebruikt. ViewModel kan 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.