Sobes.tech
Middle

Kā saglabāt ViewModel stāvokli Android arhitektūras komponentos?

sobes.tech AI

Atbilde no AI

ViewModel stāvokli var saglabāt vairākos veidos:

  1. Izmantojot SavedStateHandle: Tas ir ieteicamākais veids, kā saglabāt nelielu datu apjomu, kas nepieciešams stāvokļa atjaunošanai pēc procesa iznīcināšanas. SavedStateHandle nodrošina Map līdzīgu saskarni datu saglabāšanai un iegūšanai.

    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. Stāvokļa saglabāšana bundle (Bundle): Izmanto kopā ar onSaveInstanceState, lai saglabātu Activity vai Fragment datus, nevis tieši ViewModel. Šie dati var tikt izmantoti ViewModel inicializācijai tās izveides laikā.

    // `Activity` vai `Fragment`
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Datu saglabāšana, kas vēlāk tiks izmantoti `ViewModel` inicializācijai
        outState.putString("some_data_for_vm", " svarīga vērtība")
    }
    
    // Datu izmantošana `ViewModel` (caur fabrika)
    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("Nezināma `ViewModel` klase")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Datu izmantošana stāvokļa atjaunošanai
    }
    
  3. Datu saglabāšana pastāvīgā glabāšanā: Sarežģītāku vai lielāku datu apjomu gadījumā var izmantot SharedPreferences, datu bāzes (piemēram, Room) vai failus. ViewModel var sadarboties ar repozitoriju, kas pārvalda piekļuvi šiem datiem.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Piemērs UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logika saglabāšanai datu bāzē
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logika datu iegūšanai no datu bāzes
        }
    }
    

Izvēlētais metode ir atkarīgs no saglabājamo datu veida un apjoma, kā arī no scenārijiem, kuros nepieciešams atjaunot stāvokli (piemēram, procesa iznīcināšana vai konfigurācijas maiņa). SavedStateHandle ir vispiemērotākais stāvokļa saglabāšanai, kas jāizdzīvo procesa iznīcināšanas gadījumā un jāatjauno UI.