MWCodebymw.de ↗
Kotlin

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 / sich key ändert".
  • rememberCoroutineScope(): gibt dir einen CoroutineScope, 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

#Kotlin#Jetpack Compose#Coroutines#rememberCoroutineScope#Snackbar

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 →