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.