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:
-
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() } } -
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() } } -
Use
ViewModelProvider.Factorypara 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.