Sobes.tech
Junior

Papaskink apie Jetpack ViewModel.

sobes.tech AI

Atsakymas iš AI

ViewModel saugo ir valdo UI susijusius duomenis, atsižvelgiant į gyvenimo ciklą. Jis išlieka po konfigūracijos pakeitimų (ekrano pasukimo, išdėstymo pakeitimų), išvengdamas duomenų praradimo.

Pagrindinės savybės:

  • Duomenų išsaugojimas: ViewModel nėra sunaikinamas konfigūracijos pakeitimų metu, išlaiko UI būseną.
  • Logikos atskyrimas nuo UI: Verslo logika yra įdedama į ViewModel, tai palengvina testavimą ir palaikymą Activity/Fragment.
  • Integracija su LiveData: Dažnai naudojama su LiveData stebėti duomenų pokyčius.

Pavyzdys:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Duomenys, kuriuos reikia išsaugoti konfigūracijos pakeitimo metu
    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)

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

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

        // Rodyti duomenis iš ViewModel
        updateCounterDisplay()

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

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

Gyvavimo trukmė: ViewModel gyvena tol, kol gyvas susietas Scope (pvz., Activity). Kai Scope baigiasi, ViewModel sunaikinamas.

ViewModelProviders (dabar – ViewModelProvider) buvo naudojamas gauti ViewModel egzempliorių iki Kotlin. Kotlin rekomenduojama naudoti ViewModelProvider(this).get(MyViewModel::class.java).

Pagrindiniai pranašumai prieš įprastus klases UI būsenos saugojimui:

  • Išlieka po konfigūracijos pakeitimų.
  • Valdomas Jetpack gyvenimo ciklo framework.

Trūkumai:

  • Gali tapti per didelis sudėtingai UI logikai.
  • Neturėtų turėti nuorodų į View, Context ar kitus gyvenimo ciklo objektus, kad išvengtumėte atminties nutekėjimų.