Composable Function: co to je, syntaxe funkce a pravidla

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

Composable Function — je základní jednotkou uživatelského rozhraní v Jetpack Compose, která určuje, jak má část obrazovky vypadat a chovat se. Každá taková funkce je označena anotací @Composable a provádí se ve speciálním kontextu, který umožňuje Compose sledovat závislosti a automaticky přestavovat UI při změně dat. Podle Google Android Developers, 2026, správné vytváření Composable funkcí přímo ovlivňuje výkon aplikace a efektivitu rekompozice.

Hlavní body

  • Composable Function — funkce Kotlin s anotací @Composable vytvářející strom UI
  • Parametry musí být neměnné, měnitelná data přes state
  • Volání je možné pouze z kontextu jiné Composable funkce
  • Pořadí provádění není zaručeno — každá funkce musí být nezávislá
  • Modifier se doporučuje předávat jako parametr pro přizpůsobení

Co je Composable Function v Jetpack Compose

Composable Function — je funkce v jazyce Kotlin označená anotací @Composable, která popisuje část uživatelského rozhraní deklarativním způsobem. Místo vytváření a konfigurace View objektů přes Java kód nebo XML značky, vývojář jednoduše píše, jak má UI vypadat při každém stavu dat.

Hlavní rozdíl mezi Composable funkcí a tradičním View systémem Android spočívá v modelu aktualizace. V klasickém přístupu vývojář ručně volal findViewById, měnil text přes setText, spravoval viditelnost přes setVisibility. Composable Function od této rutiny osvobozuje: při změně dat systém sám určí, které funkce je třeba restartovat, a provede pouze je.

Kompilátor Kotlin při zpracování anotace @Composable generuje další kód, který integruje funkci do mechanismu kompozice. Tento kód zahrnuje čtení a zápis do slotů — speciálních paměťových buněk, které ukládají stav a parametry každé Composable funkce v aktuálním stromu UI. Díky této integraci Compose ví, které funkce závisí na kterých datech.

Syntaxe deklarace Composable funkce

Syntaxe Composable funkce je maximálně stručná: stačí přidat @Composable před klíčové slovo fun. Funkce může přijímat libovolné parametry, zahrnovat další Composable volání ve svém těle a používat Kotlin konstrukce — podmínky, cykly, when výrazy — pro podmíněné zobrazení UI.

kotlin
@Composable
fun ProductItem(
    product: Product,
    modifier: Modifier = Modifier,
    onAddToCart: () -> Unit
) {
    Card(modifier = modifier.padding(8.dp)) {
        Row(modifier = Modifier.fillMaxWidth().padding(12.dp),
            verticalAlignment = Alignment.CenterVertically) {
            Column(modifier = Modifier.weight(1f)) {
                Text(text = product.name, style = MaterialTheme.typography.titleMedium)
                Text(text = "${product.price}", color = MaterialTheme.colorScheme.primary)
            }
            Button(onClick = onAddToCart) {
                Text("Přidat do košíku")
            }
        }
    }
}

V tomto příkladu Composable funkce ProductItem přijímá objekt Product, modifikátor a callback. Všechny tři parametry jsou neměnné, což zaručuje předvídatelné chování při rekompozici. Modifikátor je předán jako parametr s výchozí hodnotou — to je standardní praxe umožňující volající straně přizpůsobit okraje a rozměry.

Komponenty a modifikátory v Composable funkcích

Uvnitř Composable funkce se používají vestavěné komponenty Material Design (Text, Button, Card, TextField) nebo základní primitiva (Canvas, Layout). Každá komponenta přijímá parametry pro konfiguraci vzhledu a chování a jeden nebo více modifikátorů přes parametr modifier.

Modifikátory (Modifier) — jsou řetězcem funkcí, které mění velikost, pozici, zpracování událostí a vzhled komponenty. Pořadí modifikátorů v řetězci má význam: clickable.semantics funguje jinak než semantics.clickable a padding.background barví pozadí oblasti včetně padding, což je při navrhování kritické.

Uvnitř Composable funkce lze použít podmínky if a when pro podmíněné zobrazení částí UI a cykly for pro dynamické seznamy. Všechny tyto konstrukce fungují přirozeně, protože Kotlin je plnohodnotný programovací jazyk. Je však důležité si pamatovat: pokud podmínka nebo cyklus obsahuje volání Composable funkcí, tyto se také účastní rekompozice.

kotlin
@Composable
fun ProductList(
    products: List<Product>,
    modifier: Modifier = Modifier
) {
    LazyColumn(modifier = modifier) {
        items(products, key = { it.id }) { product ->
            ProductItem(
                product = product,
                onAddToCart = { /* add to cart */ }
            )
        }
    }
}

Příklady Composable funkcí pro reálné obrazovky

Podívejme se na příklad obrazovky vyhledávání produktů s použitím několika Composable funkcí. Jsou zde zobrazeny typické vzory: vstupní pole se stavem, filtrování seznamu, zpracování prázdného výsledku a načítání.

kotlin
data class Product(
    val id: String,
    val name: String,
    val price: Double,
    val category: String
)

@Composable
fun SearchScreen() {
    var query by remember { mutableStateOf("") }
    val products = remember(query) { getFilteredProducts(query) }

    Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
        OutlinedTextField(
            value = query,
            onValueChange = { query = it },
            label = { Text("Hledat produkty") },
            modifier = Modifier.fillMaxWidth()
        )

        Spacer(modifier = Modifier.height(16.dp))

        when (products) {
            is Loading -> CircularProgressIndicator()
            is Empty -> Text("Nebyly nalezeny žádné výsledky")
            is Result -> LazyColumn {
                items(products.items, key = { it.id }) { product ->
                    ProductItem(product = product, onAddToCart = {})
                }
            }
        }
    }
}

Tento příklad demonstruje několik idiomů najednou: remember pro uložení stavu vyhledávacího dotazu, remember(query) pro filtrování s klíčem, when pro tři stavy UI a LazyColumn pro efektivní zobrazení seznamu. Každý z těchto idiomů je výsledkem praktických zkušeností s vývojem Compose aplikací.

Parametry a Slot API

Composable funkce přijímají parametry stejně jako běžné Kotlin funkce, ale s jedním důležitým rozdílem: parametr může být jiná Composable funkce předaná přes lambdu s anotací @Composable. Tento mechanismus se nazývá Slot API a je hlavním vzorem pro vytváření znovupoužitelných kontejnerů.

Slot API řeší problém, který byl v tradičním View systému řešen přes ViewGroup a programové přidávání podřízených View. Místo metod addView používá Compose content lambdy — poslední parametr s typem @Composable () -> Unit. Volající strana předá této lambdě libovolný UI a samotný kontejner určuje pouze jeho umístění.

Parametry Composable funkce mohou mít výchozí hodnoty, což zjednodušuje jejich použití v různých kontextech. Doporučuje se povinnými činit pouze ty parametry, bez kterých funkce nemůže splnit svůj úkol, a ostatní vybavit rozumnými výchozími hodnotami.

ParametrTypPříklad
PovinnýLibovolný typname: String
VolitelnýS výchozí hodnotoumodifier: Modifier = Modifier
Content@Composable () -> Unitcontent: @Composable () -> Unit
CallbackLambda bez @ComposableonClick: () -> Unit

Idiomy Composable funkcí v Kotlin

V komunitě Compose se vyvinulo několik zavedených idiomů, které činí Composable funkce čitelnějšími a předvídatelnějšími. První — State Hoisting: stav je zvednut na vyšší úroveň a Composable funkce jej dostává přes parametry. To činí funkci čistou a znovupoužitelnou v různých kontextech.

Druhý idiom — parametry Event-driven. Místo předávání ViewModel nebo useCase do Composable funkce se předávají pouze konkrétní callbacky: onSave, onDelete, onNavigateToDetail. To snižuje provázanost a zjednodušuje testování — pro test ProductItem není potřeba ViewModel, pouze lambda-stub.

Třetí idiom — CompositionLocal pro předávání společných dat přes strom kompozice. Téma, hustota obrazovky, aktuální cesta — to vše se předává přes CompositionLocal, čímž se vyhnete řetězcům parametrů přes desítky Composable funkcí. CompositionLocal by se však neměl zneužívat: explicitní parametry jsou vždy preferovány před implicitními závislostmi.

kotlin
// State Hoisting: stav zvednut do nadřazené funkce
@Composable
fun CounterDisplay(
    count: Int,
    onIncrement: () -> Unit
) {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        Text(text = "Počítadlo: $count", style = MaterialTheme.typography.headlineLarge)
        Button(onClick = onIncrement) {
            Text("+1")
        }
    }
}

// Použití se State Hoisting
@Composable
fun CounterScreen() {
    var count by remember { mutableStateOf(0) }
    CounterDisplay(
        count = count,
        onIncrement = { count++ }
    )
}

Často kladené otázky

Lze použít return v Composable funkci?

Ano, return je povolen, ale opatrně. Compose optimalizuje rekompozici na úrovni jednotlivých funkcí a předčasný return může tuto optimalizaci narušit. Je lepší použít podmíněné operátory if nebo when uvnitř těla funkce.

Čím se liší Unit-return od void v Javě?

V Kotlin je Unit objekt singleton, nikoli prázdný typ. Composable funkce vracejí Unit, což technicky znamená, že vracejí samotný objekt Unit. V praxi to však nemá význam — vrácená hodnota je systémem kompozice ignorována.

Lze předat mutableListOf do Composable funkce?

Předávání měnitelných kolekcí je možné, ale je to špatná praxe. Pokud se kolekce změní, Compose se to nedozví, protože reference na objekt zůstává stejná. Pro sledovatelné změny používejte immutable seznamy nebo mutableStateListOf.

Jak ladit Composable funkci?

Pro ladění použijte Android Studio s Layout Inspector, který zobrazuje aktuální strom Composable funkcí, hodnoty parametrů a důvody rekompozice. Funguje také běžný Kotlin debugger — zarážky uvnitř Composable funkcí se správně aktivují při každé rekompozici.

Je povinné uvádět return type u Composable funkce?

Composable funkce vždy vrací Unit, proto se return type neuvádí. Pokus o vrácení jiného typu způsobí chybu kompilace, protože anotace @Composable není kompatibilní s návratovými typy jinými než Unit.

Shrnutí

  • Composable Function — deklarativní stavební blok UI označený @Composable
  • Parametry musí být neměnné pro předvídatelnou rekompozici
  • Modifikátory a Slot API poskytují flexibilitu a znovupoužitelnost bez dědičnosti
  • State Hoisting — zvednutí stavu nahoru pro čistotu a testovatelnost
  • Event-driven callbacky snižují provázanost s ViewModel a obchodní logikou
  • CompositionLocal se používá pro společná data, ale explicitní parametry jsou preferovány
  • Idiomy Compose činí kód předvídatelným, testovatelným a výkonným

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é