Como guardar o estado do ViewModel nos componentes arquitetônicos do Android?
sobes.tech IA
Resposta da IA
Existem várias formas de guardar o estado do ViewModel:
-
Utilização de SavedStateHandle: A forma preferida para guardar pequenas quantidades de dados necessárias para restaurar o estado após a destruição do processo.
SavedStateHandlefornece uma interface semelhante a um mapa para guardar e obter dados.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) } } -
Guardar estado num bundle (Bundle): Utilizado em conjunto com
onSaveInstanceStatepara guardar dados do próprioActivityouFragment, não diretamente doViewModel. Depois, esses dados podem ser usados para inicializar oViewModelna sua criação.// No Activity ou Fragment override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) // Guardar dados que serão usados para inicializar o ViewModel outState.putString("some_data_for_vm", "valor importante") } // Uso dos dados no ViewModel (via uma fábrica) 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("Classe de ViewModel desconhecida") } } class MyViewModel(private val initialData: String) : ViewModel() { // Uso de initialData para restaurar o estado } -
Guardar dados em armazenamento permanente: Para guardar dados mais complexos ou de maior volume, pode-se usar SharedPreferences, bases de dados (por exemplo, Room) ou ficheiros. O
ViewModelpode interagir com um repositório que gere o acesso a esses dados.class MyViewModel(private val userRepository: UserRepository) : ViewModel() { fun saveUser(user: User) { userRepository.saveUser(user) } fun getUser(id: Long): LiveData<User> { return userRepository.getUser(id) } } // Exemplo de UserRepository class UserRepository(private val userDao: UserDao) { fun saveUser(user: User) { // Lógica de salvamento na base de dados } fun getUser(id: Long): LiveData<User> { // Lógica de obtenção da base de dados } }
A escolha do método depende do tipo e volume de dados a guardar, bem como dos cenários de restauração de estado que precisa suportar (por exemplo, destruição do processo vs mudança de configuração). SavedStateHandle é a mais adequada para guardar o estado que precisa sobreviver à destruição do processo e restaurar a UI.