Android Academy · Lektion

ViewModel og LiveData

Bevar data gennem konfigurationsændringer med ViewModel. Eksponér reaktive datastrømme med LiveData, og observer dem i Activities og Fragments.

Lektion 1 af 611 trin

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 repeatOnLifecycle i 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.

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 “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

  1. ViewModel og LiveData
  2. Room-database
  3. Coroutines og suspend-funktioner
  4. Repository-mønsteret
  5. Navigation Component
  6. Dependency Injection med Hilt
← Tilbage til Android Academy