Cum să salvați starea ViewModel în componentele arhitecturale Android?
sobes.tech AI
Răspuns de la AI
Există mai multe moduri de a salva starea ViewModel:
-
Utilizarea SavedStateHandle: Modul preferat pentru salvarea unor cantități mici de date necesare pentru restaurarea stării după distrugerea procesului.
SavedStateHandleoferă o interfață asemănătoare unui Map pentru salvarea și recuperarea datelor.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) } } -
Salvarea stării într-un bundle (Bundle): Este utilizată împreună cu
onSaveInstanceStatepentru a salva datele propriuluiActivitysauFragment, nu direct aleViewModel. Apoi, aceste date pot fi folosite pentru inițializareaViewModella crearea sa.// În Activity sau Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Salvarea datelor care vor fi folosite pentru inițializarea ViewModel outState.putString("some_data_for_vm", "valoare importantă") } // Utilizarea datelor în ViewModel (prin fabrică) 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("Clasă de ViewModel necunoscută") } } class MyViewModel(private val initialData: String) : ViewModel() { // Utilizarea initialData pentru restaurarea stării } -
Salvarea datelor în stocarea permanentă: Pentru date mai complexe sau de volum mai mare, se pot folosi SharedPreferences, baze de date (de exemplu, Room) sau fișiere.
ViewModelpoate interacționa cu un depozit care gestionează accesul la aceste date.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Exemplu de UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Logica de salvare în baza de date } fun getUser(id: Long): LiveData<User> { // Logica de preluare din baza de date } }
Alegerea metodei depinde de tipul și volumul datelor de salvat, precum și de scenariile de restaurare a stării (de exemplu, distrugerea procesului vs. schimbarea configurației). SavedStateHandle este cea mai potrivită pentru salvarea stării care trebuie să supraviețuiască distrugerii procesului și să refacă UI-ul.