Sobes.tech
Junior

Porozprávaj mi o Jetpack ViewModel.

sobes.tech AI

Odpoveď od AI

ViewModel uchováva a spravuje údaje spojené s používateľským rozhraním s ohľadom na životný cyklus. Prežíva zmeny konfigurácie (otočenie obrazovky, zmeny rozloženia), čím zabraňuje strate údajov.

Kľúčové vlastnosti:

  • Uloženie údajov: ViewModel sa nezničí pri zmenách konfigurácie, zachováva stav UI.
  • Oddelenie logiky od UI: Obchodná logika je umiestnená vo ViewModel, čo uľahčuje testovanie a údržbu Activity/Fragment.
  • Integrácia s LiveData: Často sa používa s LiveData na sledovanie zmien údajov.

Príklad použitia:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Údaje, ktoré je potrebné zachovať pri zmene konfigurácie
    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)

        // Získanie ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

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

        // Zobrazenie údajov z ViewModel
        updateCounterDisplay()

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

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

Životnosť: ViewModel žije tak dlho, ako žije priradený Scope (napríklad Activity). Pri ukončení Scope sa ViewModel zničí.

ViewModelProviders (teraz ViewModelProvider) sa používal na získanie inštancie ViewModel pred Kotlinom. V Kotlin sa odporúča používať ViewModelProvider(this).get(MyViewModel::class.java).

Hlavné výhody ViewModel oproti bežným triedam na ukladanie stavu UI:

  • Prežíva zmeny konfigurácie.
  • Je spravovaný rámcom životného cyklu Jetpack.

Nevýhody:

  • Môže sa stať príliš veľkým pri zložitých logikách UI.
  • Nemá obsahovať odkazy na View, Context alebo iné objekty s životným cyklom, aby sa predišlo únikom pamäte.