Android Academy · Lektion

Hvorfor bruge en ViewModel?

Håndtér konfigurationsændringer på en robust måde.

Lektion 1 af 413 trin

Hvorfor bruge en ViewModel? er en gratis Android Academy-lektion på CoddyKit. Dette er lektion 1 af 4. 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 4 lektioner i alt.

Hvad er en ViewModel?

En ViewModel er en komponent i Androids arkitektur, der er udviklet til at gemme og administrere UI-relaterede data på en måde, der tager højde for livscyklussen.

Den overlever konfigurationsændringer som skærmrotationer, så dine data ikke bliver ødelagt og oprettet igen, hver gang systemet opbygger UI'et på ny.

Problemet med konfigurationsændringer

Når du roterer enheden, ødelægger og opretter Android aktiviteten igen. Al tilstand, der ligger i aktiviteten eller den Composable, går tabt.

  • En tæller nulstilles.
  • En indlæst liste forsvinder.
  • En netværksanmodning starter måske igen.

ViewModel løser dette ved at leve uden for aktivitetens instanslivscyklus.

Sådan overlever en ViewModel

Frameworket holder den samme ViewModel-instans i live på tværs af genoprettelser. Når den nye aktivitet oprettes, får den den eksisterende ViewModel i stedet for en ny.

class CounterViewModel : ViewModel() {
    var count = 0
        private set

    fun increment() {
        count++
    }
}

Hentning af en ViewModel i Compose

I Jetpack Compose henter du typisk en ViewModel med hjælpefunktionen viewModel(). Den returnerer den samme instans for ejeren af livscyklussen.

import androidx.lifecycle.viewmodel.compose.viewModel

@Composable
fun CounterScreen(
    vm: CounterViewModel = viewModel()
) {
    Text("Count: " + vm.count)
}

Adskillelse af ansvar

En ViewModel understøtter en tydelig opdeling:

  • UI-laget (Composables/Activities) gengiver kun tilstand og videresender hændelser.
  • ViewModel indeholder tilstand og forretningslogik.

Det gør UI'et tyndere og logikken nemmere at teste.

ViewModel-omfang og ejerskab

En ViewModel er afgrænset til en ViewModelStoreOwner, som normalt er en aktivitet, et fragment eller en post på navigationsstakken.

Den ryddes automatisk, når ejeren ødelægges permanent, f.eks. når brugeren afslutter aktiviteten ved at trykke tilbage.

onCleared-tilbagekaldet

Når ViewModel endeligt ødelægges, kalder frameworket onCleared(). Brug det til at frigive ressourcer, du har åbnet.

class MyViewModel : ViewModel() {
    override fun onCleared() {
        super.onCleared()
        // cancel jobs, close listeners
    }
}

Hvad du IKKE skal placere i en ViewModel

Gem aldrig referencer til Views, Activities eller en Context, der er knyttet til UI'et, i en ViewModel. Da ViewModel lever længere end aktiviteten, medfører det hukommelseslækager.

Hvis du har brug for en applikationskontekst, skal du i stedet bruge AndroidViewModel.

AndroidViewModel til appens kontekst

Når du reelt har brug for en Context, skal du udvide AndroidViewModel, som på sikker vis giver adgang til den langlivede applikationskontekst.

class PrefsViewModel(
    app: Application
) : AndroidViewModel(app) {
    private val context = getApplication<Application>()
}

Overførsel af argumenter til konstruktøren

Hvis du vil indsætte afhængigheder, f.eks. et repository, i en ViewModel, skal du bruge en ViewModelFactory eller et DI-framework som Hilt. Vi gennemgår Hilt senere i dette spor.

class UserViewModel(
    private val repo: UserRepository
) : ViewModel() {
    // repo provided via a factory or Hilt
}

Hvorfor ViewModels er vigtige

ViewModels er en grundsten i moderne Android-arkitektur. De giver dig:

  • Overlevelse på tværs af konfigurationsændringer.
  • En tydelig adskillelse mellem UI og logik.
  • Forudsigelig og testbar håndtering af tilstand.

Hurtigt tjek

Test din forståelse af, hvorfor ViewModels bruges.

Opsummering

Du har lært:

  • En ViewModel gemmer UI-tilstand og overlever konfigurationsændringer.
  • Den må aldrig indeholde View- eller Activity-referencer, så lækager undgås.
  • Den er afgrænset til en ejer og ryddes via onCleared().
  • AndroidViewModel giver en sikker applikations-Context.
Gratis at komme i gang

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 “Hvorfor bruge en ViewModel?” gratis?

Ja — alle 3 lektioner i læringssporet Android Academy, inklusive “Hvorfor bruge en ViewModel?”, 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 4 lektioner i alt.

Hvad lærer jeg i “Hvorfor bruge en ViewModel?”?

Håndtér konfigurationsændringer på en robust måde. 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 4.

Hvor lang tid tager lektionen “Hvorfor bruge en ViewModel?”?

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

  1. Hvorfor bruge en ViewModel?
  2. Eksponering af state fra ViewModel
  3. Android-livscyklussen
  4. collectAsStateWithLifecycle
← Tilbage til Android Academy