Jetpack Compose: grunder, Composable-funktioner och State

Författare: IT Sectr Publicerad: 2026-02-21 Lästid: 8 min

Jetpack Compose — Googles moderna deklarativa UI-ramverk för Android-utveckling, släppt i stabil version 1.0 i juli 2021. Compose ersätter imperativ XML-märkning och View-systemet med Kotlin-funktioner med @Composable-annotering. Enligt Google I/O (2025) används Compose i 55 % av nya Android-projekt och den genomsnittliga UI-kodstorleken minskar med 30–50 % jämfört med XML. Ramverket ritar automatiskt om endast de ändrade delarna av skärmen vid State-ändring, vilket eliminerar manuella anrop till notifyDataSetChanged eller findViewById.

Huvudpunkter

  • Jetpack Compose — Googles deklarativa UI-ramverk för Android i Kotlin (@Composable-funktioner istället för XML-märkning).
  • @Composable — annotering av funktion som beskriver en del av UI, kan ta emot parametrar och läsa State.
  • State och MutableState — reaktivitetsmekanism: vid State-ändring startar Compose om (recompose) endast beroende Composable-funktioner.
  • remember — funktion för cachning av värde mellan rekompositioner; utan den återställs State vid varje uppdatering.
  • Modifier — kedja av inställningar (padding, size, clickable, background) som styr Composable-utseende och beteende.

Vad är Jetpack Compose?

Jetpack Compose — Googles UI-ramverk byggt på principer för reaktiv programmering. Istället för Activity med XML-layouter, FragmentManager och ViewBinding beskriver utvecklaren gränssnittet genom Kotlin-funktioner med @Composable-annotering. Compose använder inte LayoutInflater — UI är rena Kotlin-funktioner, kompilerade till bytekod. Ramverket består av flera bibliotek: Compose UI (grundläggande komponenter Text, Button, Column, Row), Compose Foundation (Material Design, Gester, Fokus), Compose Material3 (Material You med Dynamic Colors) och Compose Runtime (State, Side Effects, Coroutines). Compose fungerar på Android API 21+ (Android 5.0) och är fullt kompatibelt med befintlig View/XML-kod via ComposeView — AndroidView-adaptern.

Compose vs View System

View System (2008) använder en hierarki av View-objekt med manuell hantering: utvecklaren skapar en XML-layout, hittar View via findViewById, implementerar Adapter för RecyclerView och anropar notifyDataSetChanged vid dataändring. Compose beskriver UI funktionellt: vid tillståndsändring startar ramverket om (recompose) endast ändrade Composable-funktioner, beräknar diff och tillämpar minimala ändringar på Canvas. Compose-prestanda är jämförbar med View System, och i scenarier med komplexa listor (LazyColumn) överträffar det ofta RecyclerView genom att hoppa över onödiga element via key-parametern. På IT Sectr används Compose för nya moduler av Android-applikationer med minSdk 24+.

Composable-funktioner: byggstenar för UI

@Composable — annotering som omvandlar en vanlig Kotlin-funktion till en byggsten för UI. Composable-funktioner kan anropa andra Composable-funktioner och bilda ett komponentträd. Till skillnad från View har Composable-funktioner inget tillstånd som standard — de är stateless och ritas om vid varje ändring av indataparametrar eller State. Kompilatorn (Compose Compiler) transformerar @Composable-funktioner till kod som kan avbrytas och återupptas (positional memoization) — detta gör att Compose kan starta om endast ändrade delar utan att fullständigt bygga om trädet.

kotlin
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun UserProfile(name: String, avatarUrl: String) {
    Row(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp),
        verticalAlignment = Alignment.CenterVertically
    ) {
        AsyncImage(
            model = avatarUrl,
            contentDescription = "User avatar",
            modifier = Modifier.size(48.dp)
        )
        Spacer(modifier = Modifier.width(12.dp))
        Text(
            text = name,
            style = MaterialTheme.typography.titleMedium
        )
    }
}

Funktionen UserProfile tar emot name och avatarUrl som parametrar, bygger en rad med avatar och namn. Modifier.fillMaxWidth() sträcker ut komponenten till full bredd, .padding(16.dp) lägger till mellanrum. MaterialTheme.typography.titleMedium använder systemstilen från Material 3. Vid ändring av parametrarna name eller avatarUrl startar Compose om UserProfile — återskapande av komponenten med nya värden.

State och Recomposition i Jetpack Compose

State i Compose — varje värde vars ändring orsakar rekomposition (omstart) av beroende @Composable-funktioner. Grundmetoden är mutableStateOf(), som skapar MutableState<T> med stöd för Compose ögonblicksbildssystem. Snapshot — mekanism för spårning av ändringar: vid skrivning till State markerar Compose den aktuella Snapshot som smutsig, och rekompositionsplaneraren startar endast om de Composable-funktioner som läser detta State. För observerbara samlingar använd mutableStateListOf() och mutableStateMapOf(). Compose stöder State från Lifecycle-Aware-komponenter via collectAsState() för Kotlin Flow och observeAsState() för LiveData.

kotlin
@Composable
fun LikeButton() {
    var liked by remember { mutableStateOf(false) }
    var count by remember { mutableStateOf(42) }
    
    Button(
        onClick = {
            liked = !liked
            if (liked) count++ else count--
        },
        colors = ButtonDefaults.buttonColors(
            containerColor = if (liked) MaterialTheme.colorScheme.primary
                else MaterialTheme.colorScheme.surfaceVariant
        )
    ) {
        Text("♥ $count")
    }
}

Koden skapar en «Like»-knapp med tillstånden liked (Boolean) och count (Int), lagrade via mutableStateOf(). Vid tryckning inverteras liked, räknaren ökar/minskar — Compose startar automatiskt om LikeButton. by delegate gör det möjligt att använda State som en vanlig variabel: liked = !liked istället för liked.value = !liked.value. Knappens färg ändras reaktivt mellan primary (gillad) och surfaceVariant (ogillad).

remember: cachning mellan rekompositioner

remember — Compose-funktion som cachar värdet mellan rekompositioner. Utan remember skapar varje omstart av en Composable-funktion ett nytt tillstånd (mutableStateOf) — detta bryter applikationslogiken: vid skärmrotation eller ändring av överordnat State återställs räknaren. remember tar emot en kalkylator-lambda och beräknar värdet endast vid första kompositionen; vid efterföljande returnerar det cachade resultatet. För att återställa cachen använd remember(key) — nyckeln avgör när värdet ska beräknas om. remember(key1, key2) beräknar om vid ändring av någon nyckel. För långlivade tillstånd (som överlever skärmrotation) använd rememberSaveable — analog till remember med lagring i Bundle via SavedStateHandle.

kotlin
@Composable
fun TimerScreen() {
    var seconds by rememberSaveable { mutableStateOf(0) }
    
    LaunchedEffect(Unit) {
        while (true) {
            delay(1000)
            seconds++
        }
    }
    
    Column(
        modifier = Modifier.fillMaxSize().padding(32.dp),
        horizontalAlignment = Alignment.CenterHorizontally
    ) {
        Text(
            text = "Förfluten tid: ${seconds}s",
            style = MaterialTheme.typography.displayMedium
        )
    }
}

rememberSaveable bevarar seconds vid skärmrotation (konfigurationsändring). LaunchedEffect startar en koroutin som ökar seconds varje sekund. Vid rekomposition av TimerScreen (varje sekund) återställs seconds inte tack vare rememberSaveable. Använd vanlig remember för tillstånd som inte bör överleva konfigurationsändringar (t.ex. animeringsflaggor).

Modifier: kedja av Composable-inställningar

Modifier — oföränderligt containerobjekt som implementerar Builder-mönstret för inställning av utseende, beteende och layout för Composable-komponenter. Varje anrop till Modifier-metoden (.padding(), .width(), .clickable(), .background()) returnerar en ny Modifier med det tillagda elementet. Ordningen på modifierare är viktig: .padding(16.dp).clickable { } — mellanrum appliceras före klickhanteraren, clickable övervakar hela området med hänsyn till mellanrummet. .clickable { }.padding(16.dp) — hela området före mellanrummet är klickbart, mellanrummet flyttar innehållet inåt. Modifier stöder anpassade implementationer via then(otherModifier) och compositionLocal för åtkomst till överordnade inställningar.

kotlin
@Composable
fun CardExample() {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
            .clickable { println("Kort klickat") },
        elevation = CardDefaults.cardElevation(defaultElevation = 4.dp),
        colors = CardDefaults.cardColors(
            containerColor = MaterialTheme.colorScheme.surfaceVariant
        )
    ) {
        Column(modifier = Modifier.padding(16.dp)) {
            Text("Jetpack Compose", style = MaterialTheme.typography.titleLarge)
            Spacer(modifier = Modifier.height(8.dp))
            Text(
                "Deklarativt UI för Android med State och Modifier",
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

CardExample demonstrerar Modifier-kedjan: fillMaxWidth + padding + clickable. Card — Material3-komponent med egna elevation- och colors-inställningar. Kapslad Column har inre padding på 16dp. Compose Material3 anpassar automatiskt färger till Dynamic Color (Material You) på Android 12+. Card är en av 30+ inbyggda Material3-komponenter i Compose.

State hoisting och Compose-arkitektur

State hoisting — mönster för att lyfta tillstånd från en Composable-funktion till dess anropare, vilket gör funktionen stateless. En stateless-komponent tar emot data och callbacks via parametrar utan att äga eget State. Detta ökar återanvändbarhet och testbarhet: komponenten kan anropas med olika State och testas i förhandsgranskning. Google rekommenderar arkitekturen: ViewModel + StateFlow (eller MutableStateFlow) + collectAsState() i Compose. ViewModel lyfter tillstånd till skärmnivå, Compose visar. Sidoeffekter (LaunchedEffect, DisposableEffect) hanterar engångshändelser.

KomponentAnsvarTeknik
ViewModelLagring av State, affärslogikStateFlow, MutableStateFlow
Screen ComposableSkärmorganisation, State hoistingcollectAsState(), Scaffold, LazyColumn
Stateless ComponentUI utan tillstånd, ren visning@Composable parametrar + lambdor
Side EffectEngångsåtgärder (snackbar, navigering)LaunchedEffect, SnackbarHostState

Vanliga frågor

Vad skiljer Jetpack Compose från XML-layouter?

XML-layouter är imperativa: LayoutInflater laddar XML, findViewById hittar View, utvecklaren uppdaterar manuellt text/listor. Compose är deklarativt: UI beskrivs med Kotlin @Composable-funktioner och ramverket ritar automatiskt om endast ändrade delar vid State-ändring. Compose minskar UI-kodvolymen med 30–50 % och använder inte XML.

Behövs ett separat bibliotek för navigering i Compose?

Ja, Google tillhandahåller Navigation Compose — ett bibliotek för deklarativ navigering mellan skärmar. NavController hanterar ruttstacken, composable() registrerar skärmar, navArgument skickar parametrar. Alternativ: Voyager (community) och Decompose (Badoo). Navigation Compose är den officiella standarden med stöd för deep links och type-safe argument.

Vad är Modifier i Jetpack Compose?

Modifier — en oföränderlig container med stiliseringsmönster (padding, size, clickable, background, border, clip) som tillämpas på Composable-komponenter. Varje anrop returnerar en ny Modifier med tillagt element. Ordningen är viktig: .padding().clickable() applicerar mellanrum före klick, .clickable().padding() — omvänt. Modifier är det primära sättet att anpassa Compose-komponenter.

Fungerar Compose på alla Android-versioner?

Jetpack Compose stöder Android API 21+ (Android 5.0 Lollipop) via Compose Compiler och Compose BOM. Material 3 (Dynamic Colors) är tillgängligt på Android 12+; på äldre versioner används en reservpalett. För nya projekt rekommenderar Apple minSdk 24+ (Android 7.0), vilket täcks fullt av Compose.

Hur testar man Compose-komponenter?

Google tillhandahåller Compose UI Test — ett bibliotek för testning på JVM (Desktop) och emulator. Huvudfunktioner: composeTestRule.setContent { } för rendering av komponent, onNodeWithText() för att hitta element, performClick()/performTextInput() för åtgärder. Espresso-tester är kompatibla med Compose via ComposeTestRule, men Compose UI Test är den föredragna och snabbare metoden.

Sammanfattning

  • Jetpack Compose — Googles deklarativa UI-ramverk för Android med Kotlin @Composable-funktioner istället för XML (stabilt sedan 2021).
  • @Composable — annotering som omvandlar en Kotlin-funktion till en UI-komponent; trädet av Composable-funktioner ersätter View-hierarkin.
  • State och mutableStateOf — grunden för Compose-reaktivitet via Snapshot-systemet; rekomposition påverkar endast beroende funktioner.
  • remember cachar värdet mellan rekompositioner; rememberSaveable bevarar State vid konfigurationsändringar.
  • Modifier — kedja av inställningar (padding, size, clickable, background) som bildar en oföränderlig container; ordningen på modifierare är viktig.
  • State hoisting — mönster för att lyfta tillstånd för stateless-komponenter; ViewModel + StateFlow + collectAsState() — rekommenderad arkitektur.
  • Material 3 med Dynamic Colors (Android 12+) — standard Compose-tema med automatisk anpassning till enhetens bakgrund.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också