Sobes.tech
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.