rememberCoroutineScope – Coroutinen aus einem Klick in Jetpack Compose starten
LaunchedEffect ist super für Effekte beim Zusammenbau der UI – aber wie startest du eine Coroutine, wenn der Nutzer auf einen Button tippt? Dafür gibt es rememberCoroutineScope. Ich zeige den Unterschied und ein typisches Snackbar-Beispiel.
In Compose stolpern viele über eine simple Frage: Ich will beim Klick etwas Asynchrones tun – eine Snackbar zeigen, zu einer Listenposition scrollen, kurz warten. LaunchedEffect passt hier nicht, denn das läuft, wenn die UI zusammengebaut wird, nicht wenn jemand tippt. Die richtige Werkzeug heißt rememberCoroutineScope.
Der Unterschied in einem Satz
LaunchedEffect(key): startet eine Coroutine automatisch, gebunden an die Composition. Für „tue X, sobald dieser Screen erscheint / sichkeyändert".rememberCoroutineScope(): gibt dir einenCoroutineScope, aus dem du selbst in einem Callback (onClick,onValueChange…) eine Coroutine startest.
Beispiel: Snackbar aus einem Button
SnackbarHostState.showSnackbar ist eine suspend-Funktion – du kannst sie also nicht direkt in onClick aufrufen. Der Scope löst das:
@Composable
fun DemoScreen() {
val snackbarHostState = remember { SnackbarHostState() }
val scope = rememberCoroutineScope() // an diese Composition gebunden
Scaffold(
snackbarHost = { SnackbarHost(snackbarHostState) }
) { padding ->
Button(
onClick = {
scope.launch {
snackbarHostState.showSnackbar("Gespeichert ✓")
}
},
modifier = Modifier.padding(padding)
) { Text("Speichern") }
}
}Der scope.launch { … } im onClick ist der Kern: Der Klick ist normaler Code, die Coroutine erledigt den suspend-Teil.
Warum nicht einfach ein eigener Scope?
Du könntest theoretisch CoroutineScope(Dispatchers.Main) selbst bauen – aber dann läuft die Coroutine weiter, auch wenn der Screen längst weg ist (Leak). rememberCoroutineScope ist an die Composition gebunden: Verschwindet das Composable, wird der Scope automatisch abgebrochen. Genau das willst du.
Faustregel
- Etwas soll automatisch bei Erscheinen/Änderung passieren →
LaunchedEffect. - Etwas soll als Reaktion auf eine Nutzeraktion passieren →
rememberCoroutineScope+scope.launch.
Wenn du eine Android-App mit sauberen, ruckelfreien Interaktionen in Compose brauchst, baue ich dir das – meld dich über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
animateAsState in Jetpack Compose – flüssige Animationen in einer Zeile
Du willst, dass sich Größe, Farbe oder Position weich verändern, statt hart umzuspringen? In Compose brauchst du dafür keinen Animator und keinen State-Maschinen-Zoo – ein animateDpAsState oder animateColorAsState reicht. Ich zeige dir, wie das funktioniert.
withTimeout – hängende Coroutines nach X Sekunden abbrechen
Ein Netzwerkaufruf, der ewig hängt, blockiert deinen Ladezustand für immer. Mit `withTimeout` gibst du einer Coroutine eine Frist – läuft sie ab, bricht Kotlin sie sauber ab.
Flow.debounce – entprellte Live-Suche in Jetpack Compose
Eine Suche, die bei jedem Buchstaben eine Anfrage feuert, überlastet dein Backend. Mit `debounce` auf einem Flow wartest du eine kurze Pause ab und suchst erst dann – ideal fürs Suchfeld.