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.