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 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.
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 — 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.
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 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.
@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 — 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.
@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 — 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.
@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 — 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.
| Komponent | Ansvar | Teknik |
|---|---|---|
| ViewModel | Lagring av State, affärslogik | StateFlow, MutableStateFlow |
| Screen Composable | Skärmorganisation, State hoisting | collectAsState(), Scaffold, LazyColumn |
| Stateless Component | UI utan tillstånd, ren visning | @Composable parametrar + lambdor |
| Side Effect | Engångsåtgärder (snackbar, navigering) | LaunchedEffect, SnackbarHostState |
Vanliga frågor
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.
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.
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.
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.
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
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.
Läs också