ViewModel og LiveData
Bevar data gennem konfigurationsændringer med ViewModel. Eksponér reaktive datastrømme med LiveData, og observer dem i Activities og Fragments.
ViewModel og LiveData er en gratis Android Academy-lektion på CoddyKit. Dette er lektion 1 af 6. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Android Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Android Academy-kurset indeholder 6 lektioner i alt.
Problemet med Activities
Det giver to store problemer at gemme data direkte i en Activity:
- Når brugeren roterer telefonen, ødelægges og genskabes Activity'en — alle dine data går tabt
- Hvis du henter data fra netværket i
onCreate, hentes de igen ved hver rotation — spild af ressourcer
ViewModel løser begge problemer.
Hvad er ViewModel?
ViewModel er en Android Architecture Component, der:
- Overlever konfigurationsændringer (rotation, ændring af tema)
- Indeholder brugergrænsefladerelaterede data og forretningslogik
- Ødelægges kun, når brugeren forlader skærmen permanent
Tommelfingerregel: Hvis data skal overleve en rotation, skal du placere dem i en ViewModel.
Opret en ViewModel
Nedarv fra ViewModel, og føj den til dine Gradle-afhængigheder:
// app/build.gradle:
// implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.7.0'
// implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.7.0'
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
var count = 0
private set
fun increment() {
count++
}
fun reset() {
count = 0
}
}Hent en ViewModel i en Activity
Brug ViewModelProvider (eller delegaten by viewModels()) til at hente en ViewModel-instans:
import androidx.activity.viewModels
class CounterActivity : AppCompatActivity() {
private lateinit var binding: ActivityCounterBinding
// Android manages the ViewModel lifecycle — never instantiate it yourself
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityCounterBinding.inflate(layoutInflater)
setContentView(binding.root)
// This shows the count is preserved after rotation!
binding.tvCount.text = viewModel.count.toString()
binding.btnPlus.setOnClickListener {
viewModel.increment()
binding.tvCount.text = viewModel.count.toString()
}
}
}Hvad er LiveData?
LiveData er en observerbar dataholder. Brugergrænsefladen observerer LiveData-værdier, og brugergrænsefladen opdateres automatisk, når værdien ændres.
- Livscyklusbevidst — opdaterer kun aktive observatører (ingen nedbrud, når Activity er i baggrunden)
- Altid opdateret — nye observatører får straks den nyeste værdi
LiveData i ViewModel
Brug MutableLiveData privat (ViewModel kan skrive), og eksponér den som LiveData offentligt (brugergrænsefladen kan kun observere):
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
class CounterViewModel : ViewModel() {
private val _count = MutableLiveData(0)
val count: LiveData<Int> = _count // read-only for the UI
fun increment() {
_count.value = (_count.value ?: 0) + 1
}
fun reset() {
_count.value = 0
}
}Observer LiveData i en Activity
Kald .observe(lifecycleOwner) { value -> } for at reagere på ændringer:
class CounterActivity : AppCompatActivity() {
private val viewModel: CounterViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// ...
// Automatically updates TextView whenever count changes
viewModel.count.observe(this) { count ->
binding.tvCount.text = count.toString()
}
binding.btnPlus.setOnClickListener { viewModel.increment() }
binding.btnReset.setOnClickListener { viewModel.reset() }
}
}LiveData sammenlignet med State Flow
LiveData er den klassiske tilgang. Moderne Kotlin-kode bruger ofte StateFlow fra Kotlin Coroutines i stedet:
StateFlow— coroutine-baseret uden Android-afhængighed- Indsamles med
repeatOnLifecyclei Activity'en - Bedre til kompleks tilstandsstyring
Begge fungerer godt — LiveData er enklere at komme i gang med; du vil se StateFlow i større apps.
ViewModel med flere observatører
Flere brugergrænsefladekomponenter kan observere de samme LiveData. For eksempel kan både en TextView og en Buttons aktiverede tilstand reagere på den samme dataværdi i ViewModel — uden ekstra kode i ViewModel.
Det adskiller ansvarsområderne på en overskuelig måde: ViewModel indeholder tilstanden, mens brugergrænsefladen blot observerer og gengiver den.
Hurtigt tjek
Hvornår ødelægges en ViewModel?
Opsummering: ViewModel og LiveData
Du ved nu, hvordan du bygger brugergrænseflader, der følger livscyklussen:
- ViewModel overlever konfigurationsændringer (rotation)
- Brug
by viewModels()til at hente en ViewModel i en Activity - Mønsteret MutableLiveData (privat) / LiveData (offentligt)
- Observer med
.observe(this) { value -> updateUI(value) } - Brugergrænsefladen opdateres automatisk — ingen manuel opdatering er nødvendig
Næste trin: Gem data permanent med Room-databasen.
Lær Kotlin med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 36
- Lektioner
- 152
Ofte stillede spørgsmål
Er lektionen “ViewModel og LiveData” gratis?
Ja — alle 3 lektioner i læringssporet Android Academy, inklusive “ViewModel og LiveData”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Android Academy-kurset indeholder 6 lektioner i alt.
Hvad lærer jeg i “ViewModel og LiveData”?
Bevar data gennem konfigurationsændringer med ViewModel. Eksponér reaktive datastrømme med LiveData, og observer dem i Activities og Fragments. Du øver dig i Android Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Android Academy?
Der kræves ingen tidligere erfaring. Android Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 6.
Hvor lang tid tager lektionen “ViewModel og LiveData”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Android Academy-lektion?
Ja. Alle Android Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- ViewModel og LiveData
- Room-database
- Coroutines og suspend-funktioner
- Repository-mønsteret
- Navigation Component
- Dependency Injection med Hilt