@Composable: co to je, anotace Compose a oblast použití

Autor: IT Sectr Publikováno: 2026-06-27 Doba čtení: 8 min

Anotace @Composable — základní prvek Jetpack Compose, který mění běžnou funkci Kotlin na deklarativní stavební blok uživatelského rozhraní. Bez této anotace nelze vytvořit žádnou obrazovku v moderním vývoji pro Android. Podle Google Android Developers, 2026 používá přes 80 % nových projektů v Kotlinu Compose pro tvorbu UI a @Composable je nejčastěji používanou anotací v ekosystému.

Hlavní

  • @Composable — anotace Kotlin, která umožňuje funkci popsat UI deklarativně
  • Composable funkce mohou volat pouze jiné Composable funkce, přičemž dodržují kontext kompozice
  • Restartování Composable funkcí probíhá při změně vstupních parametrů nebo stavu
  • Pořadí volání Composable funkcí není zaručeno — Compose optimalizuje přestavbu UI
  • Pojmenování Composable funkcí se řídí pravidlem PascalCase, jako všechny komponenty v Compose

Co je @Composable v Jetpack Compose

@Composable — je anotace jazyka Kotlin, která označuje funkci jako určenou pro popis uživatelského rozhraní v rámci Jetpack Compose. Když kompilátor Kotlinu narazí na tuto anotaci, generuje další kód, který umožňuje funkci pracovat v kontextu kompozice — systému správy stromu UI.

Anotace @Composable byla představena společností Google v roce 2021 spolu s první stabilní verzí Jetpack Compose 1.0. Před jejím příchodem se vývoj rozhraní pro Android prováděl výhradně prostřednictvím značek XML a systému View. @Composable radikálně změnila přístup: místo popisu UI v samostatném souboru se značkami píše programátor rozhraní přímo v Kotlinu.

Hlavní rozdíl mezi @Composable a běžnými funkcemi Kotlin — schopnost číst a reagovat na změny stavu. Když proměnná, kterou Composable funkce čte, změní hodnotu, systém automaticky naplánuje restart (rekompozici) této funkce. To zbavuje programátora ruční aktualizace UI prostřednictvím findViewById a setText.

Vnitřní mechanika @Composable se opírá o koncept slotu — speciální oblasti paměti, která je přidělena každé funkci v rámci kompozice. V tomto slotu jsou uloženy hodnoty předané funkci, stejně jako servisní informace potřebné pro porovnání při následných voláních.

Jak deklarovat Composable funkci

Pro deklaraci Composable funkce stačí přidat anotaci @Composable před klíčové slovo fun. Funkce musí být v balíčku, který importuje anotaci z androidx.compose.runtime. Název funkce se doporučuje psát velkým písmenem — to je všeobecně přijatá konvence v komunitě Compose, která vizuálně odlišuje UI komponenty od běžných funkcí.

kotlin
import androidx.compose.runtime.Composable

@Composable
fun Greeting(name: String) {
    var count by remember { mutableStateOf(0) }
    Column {
        Text("Ahoj, $name!")
        Button(onClick = { count++ }) {
            Text("Kliknuto $count krát")
        }
    }
}

Parametry Composable funkce mohou být jakékoli — primitivní typy, řetězce, lambdy a dokonce i jiné Composable funkce předávané prostřednictvím Slot API. Doporučuje se dělat parametry neměnné (val), aby se předešlo vedlejším účinkům při rekompozici. Všechna měnitelná data by měla být spravována pomocí mechanismů stavu Compose.

Composable funkce nemohou vrátit libovolnou hodnotu jako běžné funkce — jejich jediným úkolem je vytvořit nebo aktualizovat část stromu UI. Existují však speciální vzory jako State Hoisting, při kterém Compose funkce přijímá stav a callbacky prostřednictvím parametrů a zůstává čistá a znovupoužitelná.

Pravidla Composable funkcí v Kotlinu

Systém Compose ukládá několik přísných omezení na to, jak mají Composable funkce vypadat a chovat se. První pravidlo: Composable funkce může volat pouze jiné Composable funkce nebo běžné funkce bez vedlejších účinků. To zajišťuje předvídatelnost kompozice a správnou funkci optimalizací Compose.

Druhé pravidlo se týká pořadí provádění. Compose má právo volat Composable funkce v libovolném pořadí, proto kód v těle takové funkce nesmí spoléhat na pořadí volání sousedních funkcí. Každá Composable funkce by měla být soběstačná na úrovni své pozice ve stromu UI.

Třetí pravidlo — zákaz vedlejších účinků uvnitř samotného těla Composable funkce. Operace jako zápis do databáze, odesílání síťových požadavků nebo změna vnějších proměnných musí být prováděny pouze uvnitř speciálních efektů LaunchedEffect, DisposableEffect nebo SideEffect. Porušení tohoto pravidla vede k nepředvídatelnému chování při rekompozicích.

Čtvrté pravidlo: Composable funkce by měly být idempotentní. Opakované volání se stejnouými argumenty by mělo produkovat stejné UI. Tento požadavek je nezbytný pro správnou funkci optimalizace přeskakování, při které Compose přeskakuje překreslování funkcí, jejichž vstupní data se nezměnila.

kotlin
// Správně: čistá Composable funkce bez vedlejších účinků
@Composable
fun UserCard(user: User, onClick: () -> Unit) {
    Card(modifier = Modifier.clickable { onClick() }) {
        Text(text = user.name)
    }
}

// Špatně: vedlejší účinek uvnitř těla
@Composable
fun WrongCard(userId: String) {
    // val result = viewModel.loadUser(userId)  // NENÍ POVOLENO
    Text("Načítání...")
}

Příklady použití @Composable

Podívejme se na praktický příklad vytvoření obrazovky profilu s použitím anotace @Composable. Zde demonstrujeme kombinování více Composable funkcí, práci se stavem a modifikátory — klíčovémi prvky každého rozvržení Compose.

kotlin
@Composable
fun ProfileScreen(userId: String) {
    var isFollowed by remember { mutableStateOf(false) }

    Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
        ProfileHeader(userId = userId)
        Spacer(modifier = Modifier.height(16.dp))
        StatsRow(posts = 42, followers = 1280)
        Spacer(modifier = Modifier.height(24.dp))
        FollowButton(
            isFollowed = isFollowed,
            onToggle = { isFollowed = !isFollowed }
        )
    }
}

@Composable
fun ProfileHeader(userId: String) {
    Row(verticalAlignment = Alignment.CenterVertically) {
        AsyncImage(model = "https://example.com/avatars/$userId",
            contentDescription = "User avatar")
        Spacer(modifier = Modifier.width(12.dp))
        Text(text = "Uživatel #$userId", style = MaterialTheme.typography.headlineMedium)
    }
}

@Composable
fun StatsRow(posts: Int, followers: Int) {
    Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
        StatItem("Posts", posts)
        StatItem("Followers", followers)
    }
}

@Composable
fun StatItem(label: String, value: Int) {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        Text(text = "$value", style = MaterialTheme.typography.headlineSmall)
        Text(text = label, style = MaterialTheme.typography.bodySmall)
    }
}

V příkladu je každá Composable funkce odpovědná za svou část obrazovky: ProfileScreen spravuje celkový stav a kompozici dceřiných funkcí, ProfileHeader zobrazuje avatar a jméno a StatsRow — blok se statistikami. Tento přístup se řídí principem jedné odpovědnosti a zjednodušuje znovupoužitelnost komponent.

Typy Composable funkcí a jejich účel

V Jetpack Compose existují tři hlavní typy Composable funkcí. První typ — kontejnery (Row, Column, Box, LazyColumn), které určují umístění dceřiných prvků. Druhý — zobrazovací prvky (Text, Image, Icon, Button), které vykreslují konkrétní UI komponenty. Třetí — vlastní Composable funkce, které kombinují vestavěné komponenty do znovupoužitelných bloků.

Kontejnery se liší od běžných prvků tím, že přijímají content lambdu — poslední parametr typu @Composable () -> Unit. Právě tento mechanismus umožňuje budování vnořených stromů UI: každý kontejner vytváří dceřinou kompozici s vlastním kontextem a oblastí paměti.

Vlastní Composable funkce se dělí na dva podtypy: chytré (smart) a hloupé (dumb). Chytré funkce spravují stav a logiku — obsahují volání remember, LaunchedEffect a dalších API Compose. Hloupé funkce přijímají všechna data prostřednictvím parametrů a pouze je zobrazují. Rozdělení na chytré a hloupé komponenty zlepšuje testovatelnost a znovupoužitelnost kódu.

TypPříkladÚčel
KontejnerColumn, Row, BoxSpráva umístění dceřiných prvků
PrvekText, Image, ButtonZobrazení obsahu a zpracování vstupu
VlastníProfileCard, UserListKombinace standardních komponent

@Composable a znovupoužitelnost komponent

Hlavní výhoda anotace @Composable — možnost vytvářet znovupoužitelné UI komponenty bez dědičnosti a složitých hierarchií tříd. Na rozdíl od systému View, kde každý vlastní prvek vyžadoval vytvoření Java třídy s konstruktory, je Composable komponent jednoduše funkce Kotlin s parametry.

Pro zajištění znovupoužitelnosti se používá vzor Slot API, při kterém Composable funkce přijímá content lambdy pro různé oblasti svého rozvržení. Například komponent Card může přijímat samostatný content pro záhlaví, tělo a spodní část, což jej činí univerzálním pro jakékoli obrazovky aplikace.

Modifikátory (Modifier) hrají klíčovou roli ve znovupoužitelnosti: umožňují nastavení mezer, velikostí, kliknutí a animací bez změny samotné komponenty. Doporučuje se vždy předávat Modifier jako parametr Composable funkce s výchozí hodnotou: Modifier = Modifier — to je standardní praxe přijatá v oficiálních knihovnách Google.

kotlin
@Composable
fun SectionCard(
    modifier: Modifier = Modifier,
    title: String,
    content: @Composable () -> Unit
) {
    Card(modifier = modifier) {
        Column(modifier = Modifier.padding(16.dp)) {
            Text(text = title, style = MaterialTheme.typography.titleMedium)
            Spacer(modifier = Modifier.height(8.dp))
            content()
        }
    }
}

Díky Slot API lze komponent SectionCard použít na různých obrazovkách s různým obsahem — formuláři, seznamy, textovými bloky. Kombinace modifikátorů a Slot API činí komponenty Compose maximálně flexibilními bez ztráty typové bezpečnosti, kterou poskytuje Kotlin.

Často kladené otázky

Čím se @Composable liší od běžné funkce Kotlin?

Funkce @Composable se provádí v kontextu kompozice a může číst stav, automaticky se restartující při jeho změně. Běžné funkce Kotlin nemají přístup k mechanismům sledování stavu a neúčastní se budování stromu UI.

Lze volat Composable funkci z běžné funkce?

Ne, Composable funkce lze volat pouze z jiných Composable funkcí, protože je vyžadován speciální kontext kompozice. Pro integraci kódu Compose s běžným Kotlinem se používá metoda setContent { } v Activity nebo ComposeView v systému View.

Proč se Composable funkce píší velkým písmenem?

To je konvence pojmenování přijatá v komunitě Compose. Velké písmeno vizuálně odlišuje UI komponenty od běžných funkcí, podle pravidel pojmenování tříd. Není to požadavek kompilátoru, ale doporučená praxe v dokumentaci Google.

Kolik Composable funkcí může být na jedné obrazovce?

Neexistuje žádný limit počtu. V praxi může velká obrazovka obsahovat 50–100 Composable funkcí, včetně vestavěných komponent (Text, Button) a vlastních. Compose optimalizuje strom funkcí a provádí pouze ty, jejichž vstupní data se změnila.

Může Composable funkce vrátit hodnotu?

Obvykle Composable funkce vracejí Unit, protože jejich úkolem je budovat UI. Existují však specializované funkce jako remember a derivedStateOf, které jsou označeny @Composable a vracejí hodnoty. To je výjimka, nikoli pravidlo.

Shrnutí

  • @Composable — anotace pro deklarativní popis UI v Jetpack Compose
  • Composable funkce jsou volány pouze uvnitř jiných Composable funkcí ve speciálním kontextu
  • Idempotence — každé opakované provedení se stejnouými argumenty dává stejné UI
  • Vedlejší účinky jsou zakázány v těle funkce — pouze prostřednictvím LaunchedEffect a SideEffect
  • Slot API a Modifier zajišťují znovupoužitelnost komponent bez dědičnosti
  • Kontejnerové funkce (Row, Column, LazyColumn) přijímají content lambdy pro vnořené prvky
  • Doporučení: předávejte Modifier jako parametr každé vlastní Composable funkce s výchozí hodnotou

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také