Sobes.tech
Junior

Pověz mi o Jetpack ViewModel.

sobes.tech AI

Odpověď od AI

ViewModel ukládá a spravuje data související s uživatelským rozhraním s ohledem na životní cyklus. Překonává změny konfigurace (například otočení obrazovky, změny rozvržení), čímž zabraňuje ztrátě dat.

Klíčové vlastnosti:

  • Uložení dat: ViewModel není při změnách konfigurace zničen a zachovává stav UI.
  • Oddělení logiky od UI: Obchodní logika je umístěna ve ViewModel, což usnadňuje testování a údržbu Activity/Fragment.
  • Integrace s LiveData: Často se používá s LiveData ke sledování změn dat.

Příklad použití:

// MyViewModel.kt
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
    // Data, která je třeba zachovat při změnách konfigurace
    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ískání ViewModel
        viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

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

        // Zobrazení dat z ViewModel
        updateCounterDisplay()

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

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

Délka života: ViewModel žije tak dlouho, dokud žije s ním spojený Scope (například Activity). Po ukončení Scope je ViewModel zničen.

ViewModelProviders (nyní ViewModelProvider) se používal k získání instance ViewModel před Kotlinem. V Kotlinu se doporučuje používat ViewModelProvider(this).get(MyViewModel::class.java).

Hlavní výhody ViewModel oproti běžným třídám pro ukládání stavu UI:

  • Přetrvává změny konfigurace.
  • Je řízen rámcem životního cyklu Jetpack.

Nevýhody:

  • Může být příliš velký při složité logice UI.
  • Nemá obsahovat odkazy na View, Context nebo jiné objekty s životním cyklem, aby se zabránilo únikům paměti.