Sobes.tech
Junior

Parlami di Jetpack ViewModel.

sobes.tech AI

Risposta dell'AI

ViewModel memorizza e gestisce i dati relativi all'interfaccia utente tenendo conto del ciclo di vita. Sopravvive ai cambiamenti di configurazione (come rotazioni dello schermo, modifiche del layout), prevenendo la perdita di dati.

Caratteristiche principali:

  • Salvataggio dei dati: Il ViewModel non viene distrutto durante i cambiamenti di configurazione, mantenendo lo stato dell'UI.
  • Separazione della logica dall'UI: La logica di business viene inserita nel ViewModel, facilitando test e manutenzione di Activity/Fragment.
  • Integrazione con LiveData: Spesso usato con LiveData per osservare le modifiche dei dati.

Esempio di utilizzo:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Dati da conservare durante i cambiamenti di configurazione
    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)

        // Ottenere il ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

        counterText = findViewById(R.id.counter_text)
        incrementButton = findViewById(R.id.increment_button)

        // Visualizzare i dati dal ViewModel
        updateCounterDisplay()

        incrementButton.setOnClickListener {
            viewModel.counter++
            updateCounterDisplay()
        }
    }

    private fun updateCounterDisplay() {
        counterText.text = viewModel.counter.toString()
    }
}

Durata di vita: Il ViewModel vive finché il Scope associato (ad esempio, l'Activity) è vivo. Quando il Scope termina, il ViewModel viene distrutto.

ViewModelProviders (ora ViewModelProvider) veniva usato per ottenere un'istanza di ViewModel prima di Kotlin. In Kotlin si consiglia di usare ViewModelProvider(this).get(MyViewModel::class.java).

Vantaggi principali del ViewModel rispetto alle classi normali per memorizzare lo stato dell'UI:

  • Sopravvive ai cambiamenti di configurazione.
  • È gestito dal framework del ciclo di vita di Jetpack.

Svantaggi:

  • Può diventare troppo grande con logica UI complessa.
  • Non dovrebbe contenere riferimenti a View, Context o altri oggetti con ciclo di vita, per evitare perdite di memoria.