Jetpack Compose: alapok, Composable függvények és State

Szerző: IT Sectr Megjelenés: 2026-02-21 Olvasási idő: 8 perc

Jetpack Compose — a Google modern deklaratív UI-keretrendszere Android-fejlesztéshez, amely 2021 júliusában jelent meg stabil 1.0 verzióban. A Compose felváltja az imperatív XML jelölést és View-rendszert @Composable annotációval ellátott Kotlin-függvényekkel. A Google I/O (2025) szerint a Compose az új Android-projektek 55%-ában használatos, és az UI-kód átlagos mérete 30–50%-kal csökken az XML-hez képest. A keretrendszer automatikusan csak a megváltozott képernyőrészeket rajzolja újra State változásakor, kiküszöbölve a notifyDataSetChanged vagy findViewById manuális meghívását.

Főbb pontok

  • Jetpack Compose — a Google deklaratív UI-keretrendszere Androidhoz Kotlinban (@Composable függvények XML jelölés helyett).
  • @Composable — az UI egy részét leíró függvény annotációja, amely paramétereket fogadhat és State-et olvashat.
  • State és MutableState — reaktivitási mechanizmus: State változásakor a Compose csak a függő Composable függvényeket indítja újra (recompose).
  • remember — érték gyorsítótárazása a rekompozíciók között; nélküle a State minden frissítéskor alaphelyzetbe áll.
  • Modifier — beállítások lánca (padding, size, clickable, background), amely a Composable megjelenését és viselkedését szabályozza.

Mi az a Jetpack Compose?

Jetpack Compose — a Google reaktív programozási elvekre épülő UI-keretrendszere. Az Activity XML-elrendezések, FragmentManager és ViewBinding helyett a fejlesztő a felületet @Composable annotációjú Kotlin-függvényekkel írja le. A Compose nem használ LayoutInflater-t — az UI tiszta Kotlin-függvényekből áll, amelyek bájtkódra fordulnak. A keretrendszer több könyvtárból áll: Compose UI (alapkomponensek Text, Button, Column, Row), Compose Foundation (Material Design, Gesztusok, Fókusz), Compose Material3 (Material You Dynamic Colors színekkel) és Compose Runtime (State, Side Effects, Coroutines). A Compose Android API 21+ (Android 5.0) rendszeren működik, és teljes mértékben kompatibilis a meglévő View/XML kóddal a ComposeView — AndroidView adapter segítségével.

Compose vs View System

View System (2008) View objektumok hierarchiáját használja manuális kezeléssel: a fejlesztő XML-elrendezést hoz létre, findViewById segítségével megkeresi a View-t, Adapter-t implementál a RecyclerView-hoz, és notifyDataSetChanged-et hív adatváltozáskor. A Compose funkcionálisan írja le az UI-t: állapotváltozáskor a keretrendszer csak a megváltozott Composable függvényeket indítja újra (recompose), kiszámítja a diff-et, és minimális változtatásokat alkalmaz a Canvas-on. A Compose teljesítménye összehasonlítható a View System-ével, összetett listák (LazyColumn) esetén pedig gyakran felülmúlja a RecyclerView-t a key paraméter segítségével történő felesleges elemek átugrásával. Az IT Sectr-nél a Compose-t minSdk 24+ rendelkező Android alkalmazások új moduljaiban használják.

Composable függvények: az UI építőkövei

@Composable — annotáció, amely egy közönséges Kotlin-függvényt az UI építőkövévé alakít. A Composable függvények más Composable függvényeket hívhatnak, komponensfát alkotva. A View-val ellentétben a Composable függvények alapértelmezés szerint nem rendelkeznek állapottal — stateless-ek, és minden bemeneti paraméter vagy State változásakor újrarajzolódnak. A fordító (Compose Compiler) a @Composable függvényeket megszakítható és folytatható kóddá alakítja (positional memoization) — ez lehetővé teszi a Compose számára, hogy a fa teljes újraépítése nélkül csak a megváltozott részeket indítsa újra.

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
        )
    }
}

A UserProfile függvény name és avatarUrl paramétereket fogad, sort épít avatárral és névvel. A Modifier.fillMaxWidth() teljes szélességűre nyújtja a komponenst, a .padding(16.dp) távolságokat ad hozzá. A MaterialTheme.typography.titleMedium a Material 3 rendszerstílusát használja. A name vagy avatarUrl paraméterek változásakor a Compose újraindítja a UserProfile-t — a komponens újbóli létrehozása új értékekkel.

State és Recomposition a Jetpack Compose-ban

State a Compose-ban — bármely érték, amelynek változása a függő @Composable függvények rekompozícióját (újraindítását) okozza. Az alapvető módszer a mutableStateOf(), amely MutableState<T>-t hoz létre a Compose snapshot-rendszerének támogatásával. Snapshot — változások követésének mechanizmusa: State-be íráskor a Compose az aktuális Snapshot-ot piszkosnak jelöli, és a rekompozíció-ütemező csak az ezt a State-et olvasó Composable függvényeket indítja újra. Megfigyelhető gyűjteményekhez használja a mutableStateListOf() és mutableStateMapOf() függvényeket. A Compose támogatja a State-et Lifecycle-Aware komponensekből a collectAsState() segítségével Kotlin Flow-hoz és az observeAsState() segítségével LiveData-hoz.

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")
    }
}

A kód egy «Like» gombot hoz létre liked (Boolean) és count (Int) állapottal, amelyeket a mutableStateOf() tárol. Megnyomáskor a liked megfordul, a számláló nő/csökken — a Compose automatikusan újraindítja a LikeButton-t. A by delegate lehetővé teszi a State használatát közönséges változóként: liked = !liked a liked.value = !liked.value helyett. A gomb színe reaktívan változik a primary (kedvelt) és surfaceVariant (nem kedvelt) között.

remember: gyorsítótárazás rekompozíciók között

remember — Compose függvény, amely gyorsítótárazza az értéket a rekompozíciók között. A remember nélkül minden Composable függvény újraindítás új állapotot (mutableStateOf) hoz létre — ez megtöri az alkalmazás logikáját: képernyőelforgatáskor vagy szülő State változásakor a számláló alaphelyzetbe áll. A remember egy kalkulátor-lambdát fogad, és csak az első kompozíciónál számítja ki az értéket; a következőknél a gyorsítótárazott eredményt adja vissza. A gyorsítótár alaphelyzetbe állításához használja a remember(key) függvényt — a kulcs határozza meg, mikor kell újraszámolni az értéket. A remember(key1, key2) bármely kulcs változásakor újraszámol. Hosszú élettartamú állapotokhoz (amelyek túlélik a képernyőelforgatást) használja a rememberSaveable-t — a remember megfelelője mentéssel a Bundle-be SavedStateHandle segítségével.

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 = "Eltelt: ${seconds}s",
            style = MaterialTheme.typography.displayMedium
        )
    }
}

A rememberSaveable megőrzi a seconds értéket képernyőelforgatáskor (konfigurációváltozás). A LaunchedEffect elindít egy korutint, amely másodpercenként növeli a seconds értékét. A TimerScreen rekompozíciójakor (másodpercenként) a seconds nem áll alaphelyzetbe a rememberSaveable-nek köszönhetően. Használjon sima remember-t olyan állapothoz, amelynek nem szabad túlélnie a konfigurációváltozásokat (pl. animációs jelzők).

Modifier: a Composable beállítások lánca

Modifier — megváltoztathatatlan konténerobjektum, amely a Builder mintát implementálja a Composable komponensek megjelenésének, viselkedésének és elrendezésének beállításához. A Modifier metódusának minden hívása (.padding(), .width(), .clickable(), .background()) egy új Modifier-t ad vissza a hozzáadott elemmel. A módosítók sorrendje fontos: .padding(16.dp).clickable { } — a távolság a kattintás-kezelő előtt kerül alkalmazásra, a clickable a teljes területet figyeli a távolság figyelembevételével. .clickable { }.padding(16.dp) — a távolság előtti teljes terület kattintható, a távolság befelé mozgatja a tartalmat. A Modifier támogatja az egyéni implementációkat a then(otherModifier) és a compositionLocal segítségével a szülő beállítások eléréséhez.

kotlin
@Composable
fun CardExample() {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(16.dp)
            .clickable { println("Kártyára kattintva") },
        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(
                "Deklaratív UI Androidhoz State és Modifier segítségével",
                style = MaterialTheme.typography.bodyMedium
            )
        }
    }
}

A CardExample bemutatja a Modifier láncot: fillMaxWidth + padding + clickable. A Card — Material3 komponens saját elevation és colors beállításokkal. A beágyazott Column belső padding értéke 16dp. A Compose Material3 automatikusan igazítja a színeket a Dynamic Color-hoz (Material You) Android 12+ rendszeren. A Card a Compose 30+ beépített Material3 komponensének egyike.

State hoisting és a Compose architektúrája

State hoisting — az állapot felemelésének mintája a Composable függvényből a hívóba, ami stateless-sé teszi a függvényt. A stateless komponens adatokat és callback-eket fogad paramétereken keresztül, nem rendelkezik saját State-tel. Ez növeli az újrafelhasználhatóságot és tesztelhetőséget: a komponens különböző State-ekkel hívható meg és előnézetben tesztelhető. A Google az alábbi architektúrát ajánlja: ViewModel + StateFlow (vagy MutableStateFlow) + collectAsState() a Compose-ban. A ViewModel felemeli az állapotot képernyő szintre, a Compose megjeleníti. A mellékhatások (LaunchedEffect, DisposableEffect) egyszeri eseményeket kezelnek.

KomponensFelelősségTechnológia
ViewModelState tárolása, üzleti logikaStateFlow, MutableStateFlow
Screen ComposableKépernyő szervezése, State hoistingcollectAsState(), Scaffold, LazyColumn
Stateless ComponentUI állapot nélkül, tiszta megjelenítés@Composable paraméterek + lambdák
Side EffectEgyszeri műveletek (snackbar, navigáció)LaunchedEffect, SnackbarHostState

Gyakran Ismételt Kérdések

Miben különbözik a Jetpack Compose az XML-elrendezésektől?

XML-elrendezések imperatívak: a LayoutInflater betölti az XML-t, a findViewById megkeresi a View-t, a fejlesztő manuálisan frissíti a szöveget/listákat. A Compose deklaratív: az UI Kotlin @Composable függvényekkel írható le, és a keretrendszer automatikusan csak a megváltozott részeket rajzolja újra State változásakor. A Compose 30–50%-kal csökkenti az UI kód mennyiségét, és nem használ XML-t.

Szükséges külön könyvtár a navigációhoz a Compose-ban?

Igen, a Google biztosítja a Navigation Compose könyvtárat a deklaratív navigációhoz a képernyők között. A NavController kezeli az útvonalvermeket, a composable() regisztrálja a képernyőket, a navArgument paramétereket ad át. Alternatívák: Voyager (közösségi) és Decompose (Badoo). A Navigation Compose a hivatalos szabvány deep linkek és type-safe argumentumok támogatásával.

Mi az a Modifier a Jetpack Compose-ban?

Modifier — a Composable komponensekre alkalmazott stílusminták (padding, size, clickable, background, border, clip) megváltoztathatatlan konténere. Minden hívás egy új Modifier-t ad vissza a hozzáadott elemmel. A sorrend fontos: .padding().clickable() a kattintás előtt alkalmazza a távolságot, .clickable().padding() — fordítva. A Modifier a Compose komponensek testreszabásának elsődleges módja.

Működik a Compose az Android összes verzióján?

A Jetpack Compose támogatja az Android API 21+ (Android 5.0 Lollipop) rendszert a Compose Compiler és Compose BOM segítségével. A Material 3 (Dynamic Colors) Android 12+ rendszeren érhető el; régebbi verziókon fallback paletta használatos. Új projektekhez az Apple minSdk 24+ (Android 7.0) értéket ajánl, amelyet a Compose teljes mértékben lefed.

Hogyan tesztelhetők a Compose komponensek?

A Google biztosítja a Compose UI Test könyvtárat teszteléshez JVM (Desktop) és emulátor alatt. Fő függvények: composeTestRule.setContent { } a komponens megjelenítéséhez, onNodeWithText() elemek kereséséhez, performClick()/performTextInput() műveletekhez. Az Espresso tesztek kompatibilisek a Compose-zal a ComposeTestRule segítségével, de a Compose UI Test a preferált és gyorsabb megközelítés.

Összefoglalás

  • Jetpack Compose — a Google deklaratív UI-keretrendszere Androidhoz Kotlin @Composable függvényekkel XML helyett (stabil 2021 óta).
  • @Composable — annotáció, amely Kotlin-függvényt UI komponenssé alakít; a Composable függvények fája helyettesíti a View hierarchiát.
  • State és mutableStateOf — a Compose reaktivitásának alapja a Snapshot rendszeren keresztül; a rekompozíció csak a függő függvényeket érinti.
  • remember gyorsítótárazza az értéket a rekompozíciók között; a rememberSaveable megőrzi a State-et konfigurációváltozásokkor.
  • Modifier — beállítások lánca (padding, size, clickable, background), amely megváltoztathatatlan konténert alkot; a módosítók sorrendje fontos.
  • State hoisting — az állapot felemelésének mintája stateless komponensekhez; ViewModel + StateFlow + collectAsState() — ajánlott architektúra.
  • Material 3 Dynamic Colors színekkel (Android 12+) — a Compose alapértelmezett témája automatikus igazítással a készülék háttérképéhez.

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is