Hogyan menthető el a ViewModel állapota az Android architektúrális komponenseiben?
sobes.tech MI
Válasz az MI-től
A ViewModel állapotát többféleképpen lehet menteni:
-
SavedStateHandle használata: Ez az ajánlott módszer kis adatmennyiség mentésére, amelyek szükségesek az állapot helyreállításához a folyamat megsemmisítése után. A
SavedStateHandleegy Map-szerű felületet biztosít az adatok mentéséhez és lekéréséhez.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) } } -
Állapot mentése Bundle-ben: Az
onSaveInstanceState-el együtt használva azActivityvagyFragmentsaját adatait menti, nem közvetlenül aViewModel. Ezek az adatok később felhasználhatók aViewModelinicializálásához.// Activity vagy Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Az adatok mentése, amelyek később a ViewModel inicializálásához lesznek felhasználva outState.putString("some_data_for_vm", "fontos érték") } // Adatok felhasználása a ViewModel-ben (gyári osztályon keresztül) 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("Ismeretlen ViewModel osztály") } } class MyViewModel(private val initialData: String) : ViewModel() { // Az initialData használata az állapot helyreállításához } -
Adatok mentése állandó tárolóba: Komplexebb vagy nagyobb adatmennyiség esetén a SharedPreferences, adatbázisok (pl. Room) vagy fájlok használata javasolt. A
ViewModelkommunikálhat egy repository-val, amely kezeli ezekhez az adatokhoz való hozzáférést.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Példa UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Mentési logika az adatbázisba } fun getUser(id: Long): LiveData<User> { // Lekérdezési logika az adatbázisból } }
A módszer kiválasztása a menteni kívánt adatok típusától és mennyiségétől, valamint az állapot helyreállítási forgatókönyveitől függ (pl. folyamat megsemmisítése vs. konfigurációváltás). A SavedStateHandle a legalkalmasabb az olyan állapot mentésére, amely túléli a folyamat megsemmisítését és lehetővé teszi a UI helyreállítását.