Junior
Fale sobre Jetpack ViewModel.
sobes.tech IA
Resposta da IA
O ViewModel armazena e gere dados relacionados com a interface de utilizador tendo em conta o ciclo de vida. Sobrevive a alterações de configuração (como rotações de ecrã, alterações de layout), evitando a perda de dados.
Características principais:
- Guardar dados: O ViewModel não é destruído durante alterações de configuração, mantendo o estado da UI.
- Separação de lógica e UI: A lógica de negócio é colocada no ViewModel, o que facilita testes e manutenção de Activity/Fragment.
- Integração com LiveData: Frequentemente usado com LiveData para observar alterações nos dados.
Exemplo de uso:
// MyViewModel.kt
import androidx.lifecycle.ViewModel
class MyViewModel : ViewModel() {
// Dados que devem ser mantidos durante alterações de configuração
var counter = 0
}
// MyActivity.kt
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.TextView
import androidx.lifecycle.ViewModelProvider
class MyActivity : AppCompatActivity() {
private lateinit var viewModel: MyViewModel
private lateinit var counterText: TextView
private lateinit var incrementButton: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Obtenção do ViewModel
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
counterText = findViewById(R.id.counter_text)
incrementButton = findViewById(R.id.increment_button)
// Mostrar dados do ViewModel
updateCounterDisplay()
incrementButton.setOnClickListener {
viewModel.counter++
updateCounterDisplay()
}
}
private fun updateCounterDisplay() {
counterText.text = viewModel.counter.toString()
}
}
Duração de vida: O ViewModel vive enquanto o Scope associado (por exemplo, a Activity) estiver vivo. Quando o Scope termina, o ViewModel é destruído.
ViewModelProviders (agora ViewModelProvider) era usado para obter uma instância de ViewModel antes de Kotlin. Em Kotlin, recomenda-se usar ViewModelProvider(this).get(MyViewModel::class.java).
Vantagens principais do ViewModel em relação às classes normais para armazenar o estado da UI:
- Sobrevive a alterações de configuração.
- É gerido pelo framework do ciclo de vida do Jetpack.
Desvantagens:
- Pode tornar-se demasiado grande com lógica de UI complexa.
- Não deve conter referências a View, Context ou outros objetos com ciclo de vida, para evitar fugas de memória.