Sobes.tech
Junior

Mesélj a Jetpack ViewModel-ről.

sobes.tech MI

Válasz az MI-től

A ViewModel tárolja és kezeli a UI-hoz kapcsolódó adatokat, figyelembe véve az életciklusát. Átéli a konfigurációs változásokat (például képernyőforgatás, elrendezés módosítások), elkerülve az adatok elvesztését.

Fő jellemzők:

  • Adatok mentése: A ViewModel nem pusztul el konfigurációs változások során, megőrizve az UI állapotát.
  • Logika elkülönítése az UI-tól: Az üzleti logikát a ViewModel-be helyezzük, ami megkönnyíti a tesztelést és az Activity/Fragment karbantartását.
  • Integráció LiveData-val: Gyakran használják a Data változásainak megfigyelésére LiveData-val.

Használati példa:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Az adatok, amelyeket meg kell tartani konfigurációs változások során
    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)

        // ViewModel megszerzése
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

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

        // Adatok megjelenítése a ViewModel-ből
        updateCounterDisplay()

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

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

Élettartam: A ViewModel addig él, amíg a hozzá kapcsolódó Scope (pl. Activity) él. Amikor a Scope véget ér, a ViewModel megsemmisül.

A ViewModelProviders (mostantól ViewModelProvider) korábban a ViewModel példányának megszerzésére szolgált Kotlin előtt. Kotlinban ajánlott a ViewModelProvider(this).get(MyViewModel::class.java) használata.

A ViewModel fő előnyei a szokásos osztályokhoz képest a UI állapotának tárolásában:

  • Átéli a konfigurációs változásokat.
  • A Jetpack életciklus-keretrendszere által kezelt.

Hátrányok:

  • Nagyobb lehet összetett UI logikával.
  • Nem tartalmazhat hivatkozásokat View, Context vagy más életciklus-objektumokra, hogy elkerülje a memóriaszivárgásokat.