Composable Function: Was es ist, Funktionssyntax und Regeln

Autor: IT Sectr Veröffentlicht: 2026-06-27 Lesezeit: 8 Min.

Composable Function ist eine grundlegende Einheit der Benutzeroberfläche in Jetpack Compose, die definiert, wie ein Teil des Bildschirms aussehen und sich verhalten soll. Jede solche Funktion ist mit der @Composable-Annotation markiert und wird in einem speziellen Kontext ausgeführt, der es Compose ermöglicht, Abhängigkeiten zu verfolgen und die UI bei Datenänderungen automatisch neu aufzubauen. Laut Google Android Developers, 2026 wirkt sich der korrekte Aufbau von Composable-Funktionen direkt auf die Anwendungsleistung und die Effizienz der Neuzusammensetzung aus.

Wichtige Punkte

  • Composable Function — eine Kotlin-Funktion mit @Composable-Annotation, die einen UI-Baum aufbaut
  • Parameter müssen unveränderlich sein, veränderliche Daten gehen über state
  • Aufruf ist nur aus dem Kontext einer anderen Composable-Funktion möglich
  • Ausführungsreihenfolge ist nicht garantiert — jede Funktion muss unabhängig sein
  • Modifier wird empfohlen als Parameter für Anpassung zu übergeben

Was ist eine Composable Function in Jetpack Compose

Eine Composable Function ist eine Funktion in der Sprache Kotlin, die mit der @Composable-Annotation markiert ist und einen Teil der Benutzeroberfläche deklarativ beschreibt. Anstatt View-Objekte durch Java-Code oder XML-Markup zu erstellen und zu konfigurieren, schreibt der Entwickler einfach, wie die UI für jeden Datenzustand aussehen soll.

Der Hauptunterschied zwischen einer Composable-Funktion und dem traditionellen Android-View-System liegt im Aktualisierungsmodell. Beim klassischen Ansatz rief der Entwickler manuell findViewById auf, änderte Text über setText und verwaltete die Sichtbarkeit über setVisibility. Composable Function befreit Sie von dieser Routine: Wenn sich Daten ändern, bestimmt das System selbst, welche Funktionen neu zusammengesetzt werden müssen, und führt nur diese aus.

Der Kotlin-Compiler generiert bei der Verarbeitung der @Composable-Annotation zusätzlichen Code, der die Funktion in den Kompositionsmechanismus integriert. Dieser Code umfasst das Lesen und Schreiben in Slots — spezielle Speicherzellen, die den Zustand und die Parameter jeder Composable-Funktion im aktuellen UI-Baum speichern. Dank dieser Integration weiß Compose, welche Funktionen von welchen Daten abhängen.

Syntax der Deklaration einer Composable-Funktion

Die Syntax einer Composable-Funktion ist äußerst prägnant: Fügen Sie einfach @Composable vor dem Schlüsselwort fun hinzu. Die Funktion kann beliebige Parameter annehmen, andere Composable-Aufrufe in ihrem Rumpf enthalten und Kotlin-Konstrukte — Bedingungen, Schleifen, when-Ausdrücke — für bedingte UI-Rendering verwenden.

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("In den Warenkorb")
            }
        }
    }
}

In diesem Beispiel nimmt die Composable-Funktion ProductItem ein Product-Objekt, einen Modifikator und einen Callback an. Alle drei Parameter sind unveränderlich, was ein vorhersagbares Verhalten während der Neuzusammensetzung garantiert. Der Modifikator wird als Parameter mit einem Standardwert übergeben — dies ist eine Standardpraxis, die dem Aufrufer ermöglicht, Abstände und Größen anzupassen.

Komponenten und Modifikatoren in Composable-Funktionen

Innerhalb einer Composable-Funktion werden integrierte Material Design-Komponenten (Text, Button, Card, TextField) oder grundlegende Primitive (Canvas, Layout) verwendet. Jede Komponente akzeptiert Parameter zur Konfiguration von Aussehen und Verhalten sowie einen oder mehrere Modifikatoren über den Parameter modifier.

Modifikatoren sind eine Kette von Funktionen, die Größe, Position, Ereignisbehandlung und Aussehen einer Komponente ändern. Die Reihenfolge der Modifikatoren in der Kette ist wichtig: clickable.semantics funktioniert anders als semantics.clickable, und padding.background färbt sowohl den Bereich als auch den Hintergrund einschließlich des Padding, was beim Entwerfen von entscheidender Bedeutung ist.

Innerhalb einer Composable-Funktion können Sie if- und when-Bedingungen für bedingtes Rendern von UI-Teilen sowie for-Schleifen für dynamische Listen verwenden. Alle diese Konstrukte funktionieren auf natürliche Weise, da Kotlin eine vollwertige Programmiersprache ist. Es ist jedoch wichtig zu beachten: Wenn eine Bedingung oder Schleife Composable-Funktionsaufrufe enthält, nehmen diese auch an der Neuzusammensetzung teil.

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

Beispiele für Composable-Funktionen für reale Bildschirme

Betrachten wir ein Beispiel einer Produktsuchmaske mit mehreren Composable-Funktionen. Typische Muster werden hier gezeigt: ein Eingabefeld mit Zustand, Listenfilterung, Behandlung leerer Ergebnisse und Laden.

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("Produkte suchen") },
            modifier = Modifier.fillMaxWidth()
        )

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

        when (products) {
            is Loading -> CircularProgressIndicator()
            is Empty -> Text("Keine Ergebnisse gefunden")
            is Result -> LazyColumn {
                items(products.items, key = { it.id }) { product ->
                    ProductItem(product = product, onAddToCart = {})
                }
            }
        }
    }
}

Dieses Beispiel zeigt mehrere Idiome auf einmal: remember zum Erhalten des Suchabfragezustands, remember(query) zum Filtern mit einem Schlüssel, when für drei UI-Zustände und LazyColumn für effizientes Listen-Rendering. Jedes dieser Idiome ist das Ergebnis praktischer Erfahrung bei der Entwicklung von Compose-Anwendungen.

Parameter und Slot API

Composable-Funktionen akzeptieren Parameter genauso wie normale Kotlin-Funktionen, aber mit einem wichtigen Unterschied: Ein Parameter kann eine andere Composable-Funktion sein, die über eine Lambda mit der @Composable-Annotation übergeben wird. Dieser Mechanismus wird Slot API genannt und ist das Hauptmuster zum Erstellen wiederverwendbarer Container.

Die Slot API löst das Problem, das im traditionellen View-System über ViewGroup und das programmgesteuerte Hinzufügen von untergeordneten Views gelöst wurde. Anstelle von addView-Methoden verwendet Compose content-Lambdas — den letzten Parameter mit dem Typ @Composable () -> Unit. Der Aufrufer übergibt beliebige UI in diese Lambda, und der Container definiert nur sein Layout.

Parameter von Composable-Funktionen können Standardwerte haben, was ihre Verwendung in verschiedenen Kontexten vereinfacht. Es wird empfohlen, nur die Parameter obligatorisch zu machen, ohne die die Funktion ihre Aufgabe nicht erfüllen kann, und für die übrigen vernünftige Standardwerte bereitzustellen.

ParameterTypBeispiel
ErforderlichBeliebiger Typname: String
OptionalMit Standardwertmodifier: Modifier = Modifier
Content@Composable () -> Unitcontent: @Composable () -> Unit
CallbackLambda ohne @ComposableonClick: () -> Unit

Idiome von Composable-Funktionen in Kotlin

In der Compose-Community haben sich mehrere etablierte Idiome herausgebildet, die Composable-Funktionen lesbarer und vorhersagbarer machen. Das erste ist State Hoisting: Der Zustand wird auf eine höhere Ebene gehoben, und die Composable-Funktion erhält ihn über Parameter. Dies macht die Funktion rein und in verschiedenen Kontexten wiederverwendbar.

Das zweite Idiom sind Event-driven Parameter. Anstatt eine ViewModel oder useCase an eine Composable-Funktion zu übergeben, werden nur spezifische Callbacks übergeben: onSave, onDelete, onNavigateToDetail. Dies reduziert die Kopplung und vereinfacht das Testen — ein Test für ProductItem benötigt keine ViewModel, sondern nur einen Lambda-Stub.

Das dritte Idiom ist CompositionLocal zum Übergeben gemeinsamer Daten durch den Kompositionsbaum. Theme, Bildschirmdichte, aktuelle Route — all dies wird über CompositionLocal übergeben, wodurch Parameterketten durch Dutzende von Composable-Funktionen vermieden werden. CompositionLocal sollte jedoch nicht übermäßig verwendet werden: Explizite Parameter sind impliziten Abhängigkeiten immer vorzuziehen.

kotlin
// State Hoisting: Zustand in die Elternfunktion gehoben
@Composable
fun CounterDisplay(
    count: Int,
    onIncrement: () -> Unit
) {
    Column(horizontalAlignment = Alignment.CenterHorizontally) {
        Text(text = "Zähler: $count", style = MaterialTheme.typography.headlineLarge)
        Button(onClick = onIncrement) {
            Text("+1")
        }
    }
}

// Verwendung mit State Hoisting
@Composable
fun CounterScreen() {
    var count by remember { mutableStateOf(0) }
    CounterDisplay(
        count = count,
        onIncrement = { count++ }
    )
}

Häufig gestellte Fragen

Kann man return in einer Composable-Funktion verwenden?

Ja, return ist erlaubt, aber mit Vorsicht. Compose optimiert die Neuzusammensetzung auf der Ebene einzelner Funktionen, und ein frühzeitiges return kann diese Optimierung beeinträchtigen. Es ist besser, bedingte Operatoren if oder when innerhalb des Funktionskörpers zu verwenden.

Wie unterscheidet sich Unit-return von void in Java?

In Kotlin ist Unit ein Singleton-Objekt, kein leerer Typ. Composable-Funktionen geben Unit zurück, was technisch bedeutet, dass sie das Unit-Objekt selbst zurückgeben. In der Praxis spielt dies jedoch keine Rolle — der Rückgabewert wird vom Kompositionssystem ignoriert.

Kann man mutableListOf an eine Composable-Funktion übergeben?

Das Übergeben von änderbaren Sammlungen ist möglich, aber eine schlechte Praxis. Wenn sich die Sammlung ändert, erfährt Compose nichts davon, da die Objektreferenz gleich bleibt. Verwenden Sie unveränderliche Listen oder mutableStateListOf für verfolgte Änderungen.

Wie debuggt man eine Composable-Funktion?

Verwenden Sie zum Debuggen Android Studio mit Layout Inspector, der den aktuellen Baum der Composable-Funktionen, Parameterwerte und Neuzusammensetzungsgründe anzeigt. Der normale Kotlin-Debugger funktioniert ebenfalls — Haltepunkte innerhalb von Composable-Funktionen werden bei jeder Neuzusammensetzung korrekt ausgelöst.

Muss der Rückgabetyp einer Composable-Funktion angegeben werden?

Eine Composable-Funktion gibt immer Unit zurück, daher wird der Rückgabetyp nicht angegeben. Der Versuch, einen anderen Typ zurückzugeben, führt zu einem Kompilierungsfehler, da die @Composable-Annotation mit Nicht-Unit-Rückgabetypen inkompatibel ist.

Zusammenfassung

  • Composable Function — ein deklarativer UI-Baustein, markiert mit @Composable
  • Parameter müssen für vorhersagbare Neuzusammensetzung unveränderlich sein
  • Modifikatoren und Slot API bieten Flexibilität und Wiederverwendung ohne Vererbung
  • State Hoisting — Zustand nach oben heben für Sauberkeit und Testbarkeit
  • Event-driven Callbacks reduzieren Kopplung mit ViewModel und Geschäftslogik
  • CompositionLocal wird für gemeinsame Daten verwendet, aber explizite Parameter sind vorzuziehen
  • Compose-Idiome machen Code vorhersagbar, testbar und leistungsfähig

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch