Sobes.tech
Junior

Fale sobre Jetpack ViewModel.

sobes.tech IA

Resposta da IA

O ViewModel é um componente do Jetpack projetado para armazenar e gerir dados de forma vinculada à interface de utilizador. O seu objetivo principal é manter os dados da UI durante alterações de configuração, como a rotação de ecrã, e sobreviver ao ciclo de vida da Activity ou Fragment.

Características do ViewModel:

  • Armazenamento de dados: Sobrevive a alterações de configuração e até à morte da Activity/Fragment, restaurando os dados na sua recriação.
  • Separação de lógica: Separa a lógica de preparação de dados para a UI da própria UI (Activity/Fragment).
  • Ligação ao ciclo de vida: Está associado ao ciclo de vida da Activity ou Fragment.
  • Prevenção de fugas de memória: Não mantém referências diretas a View, Lifecycle ou Activity/Fragment, o que previne fugas de memória.

Como usar:

  1. Crie uma classe que herde de ViewModel.

    class MyViewModel : ViewModel() {
        private val _data = MutableLiveData<String>()
        val data: LiveData<String> = _data
    
        init {
            // Inicialização de dados
        }
    
        fun fetchData() {
            // Lógica de carregamento de dados
            _data.value = "Dados carregados"
        }
    
        override fun onCleared() {
            // Limpeza de recursos
            super.onCleared()
        }
    }
    
  2. Obtenha uma instância de ViewModel numa Activity ou Fragment.

    class MyActivity : AppCompatActivity() {
        private lateinit var viewModel: MyViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
    
            viewModel.data.observe(this, Observer { newData ->
                // Atualizar UI
            })
    
            viewModel.fetchData()
        }
    }
    
  3. Use ViewModelProvider.Factory para criar instâncias de ViewModel com dependências.

    class MyViewModel(private val repository: MyRepository) : ViewModel() {
        // ...
    }
    
    class MyViewModelFactory(private val repository: MyRepository) : ViewModelProvider.Factory {
        override fun <T : ViewModel> create(modelClass: Class<T>): T {
            if (modelClass.isAssignableFrom(MyViewModel::class.java)) {
                @Suppress("UNCHECKED_CAST")
                return MyViewModel(repository) as T
            }
            throw IllegalArgumentException("Classe ViewModel desconhecida")
        }
    }
    
    // Em uma Activity/Fragment
    // val repository = MyRepository() // Injeção de dependência
    // viewModel = ViewModelProvider(this, MyViewModelFactory(repository)).get(MyViewModel::class.java)
    

Comparação com onSaveInstanceState():

Característica ViewModel onSaveInstanceState()
Sobrevivência a mudanças de configuração Sim Sim (para pequenos volumes de dados)
Sobrevivência ao processo Não (os dados são perdidos após a destruição do processo) Sim (para pequenos volumes de dados)
Armazenamento de dados Objetos, LiveData Bundle (primitivos, Serializable, Parcelable)
Fugas de memória Não (se usado corretamente) Possível ao manter referências a Activity/View
Complexidade de implementação Mais difícil para cenários simples Mais simples para cenários simples

O ViewModel ajuda a criar aplicações mais resistentes e fáceis de testar, separando a UI da lógica de processamento de dados.