Sobes.tech
Middle

Kaip išsaugoti ViewModel būseną Android architektūros komponentuose?

sobes.tech AI

Atsakymas iš AI

ViewModel būseną galima išsaugoti keliais būdais:

  1. Naudojant SavedStateHandle: Tai yra pageidaujamas būdas išsaugoti mažą duomenų kiekį, kuris reikalingas būsenos atkūrimui po proceso sunaikinimo. SavedStateHandle suteikia Map panašų sąsają duomenų saugojimui ir gavimui.

    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. Būsenos išsaugojimas bundle (Bundle): Naudojama kartu su onSaveInstanceState, kad išsaugotų Activity arba Fragment duomenis, o ne tiesiogiai ViewModel. Šie duomenys gali būti naudojami ViewModel inicializacijai jos sukūrimo metu.

    // Activity arba Fragment
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        // Duomenų išsaugojimas, kurie vėliau bus naudojami `ViewModel` inicializacijai
        outState.putString("some_data_for_vm", " svarbi reikšmė")
    }
    
    // Duomenų naudojimas `ViewModel` (per fabriką)
    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("Nežinoma `ViewModel` klasė")
        }
    }
    
    class MyViewModel(private val initialData: String) : ViewModel() {
        // Naudojant initialData būsenos atkūrimui
    }
    
  3. Duomenų išsaugojimas nuolatiniame saugykloje: Sudėtingesnių ar didesnių duomenų atveju galima naudoti SharedPreferences, duomenų bazes (pvz., Room) arba failus. ViewModel gali sąveikauti su repository, kuris valdo prieigą prie šių duomenų.

    class MyViewModel(private val userRepository: UserRepository) : ViewModel() {
        fun saveUser(user: User) {
            userRepository.saveUser(user)
        }
    
        fun getUser(id: Long): LiveData<User> {
            return userRepository.getUser(id)
        }
    }
    
    // Pavyzdys UserRepository
    class UserRepository(private val userDao: UserDao) {
        fun saveUser(user: User) {
            // Logika išsaugojimui duomenų bazėje
        }
    
        fun getUser(id: Long): LiveData<User> {
            // Logika duomenų gavimui iš duomenų bazės
        }
    }
    

Pasirinktas metodas priklauso nuo saugomų duomenų tipo ir kiekio, taip pat nuo scenarijų, kuriuose reikia atkurti būseną (pvz., proceso sunaikinimas vs. konfigūracijos keitimas). SavedStateHandle yra tinkamiausias būdas išsaugoti būseną, kuri turi išlikti po proceso sunaikinimo ir leisti atkurti UI.