Sobes.tech
Middle

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:

  1. 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. SavedStateHandle fornece 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)
        }
    }
    
  2. Guardar estado num bundle (Bundle): Utilizado em conjunto com onSaveInstanceState para guardar dados do próprio Activity ou Fragment, não diretamente do ViewModel. Depois, esses dados podem ser usados para inicializar o ViewModel na 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
    }
    
  3. 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 ViewModel pode 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.