MWCodebymw.de ↗
Kotlin

LaunchedEffect in Compose – Effekte genau einmal auslösen

Datenladen oder eine Snackbar direkt im Composable-Body? Das feuert bei jeder Recomposition erneut. Mit LaunchedEffect bindest du Nebenwirkungen sauber an einen Schlüssel.

Ein Composable kann bei jeder Zustandsänderung neu ausgeführt werden (Recomposition) – manchmal Dutzende Male pro Sekunde. Wenn du eine Nebenwirkung wie „Daten laden" oder „Snackbar zeigen" direkt in den Body schreibst, läuft sie viel zu oft. Genau dafür gibt es LaunchedEffect: Es startet eine Coroutine, die an einen Schlüssel gebunden ist und nur neu läuft, wenn sich der Schlüssel ändert.

Daten beim Öffnen laden

import androidx.compose.runtime.*
import androidx.lifecycle.compose.collectAsStateWithLifecycle

@Composable
fun UserScreen(userId: String, vm: UserViewModel) {
    // Läuft genau einmal pro userId – nicht bei jeder Recomposition.
    // Wechselt userId, wird die alte Coroutine abgebrochen und neu gestartet.
    LaunchedEffect(userId) {
        vm.load(userId)
    }

    val state by vm.state.collectAsStateWithLifecycle()
    // ... UI je nach state ...
}

Der Schlüssel userId ist der Kern: Solange er gleich bleibt, läuft der Effekt nicht erneut. Willst du einen Effekt nur ein einziges Mal beim ersten Anzeigen ausführen, nimm einen konstanten Schlüssel:

LaunchedEffect(Unit) {
    snackbarHostState.showSnackbar("Willkommen zurück!")
}

Der häufigste Fehler

Nicht so:

@Composable
fun Broken(vm: UserViewModel) {
    vm.load("42") // ❌ läuft bei JEDER Recomposition erneut
}

Solche direkten Aufrufe im Body sind eine der häufigsten Compose-Fallen. Merke dir: Alles, was *etwas auslöst* (Netzwerk, Datenbank, Navigation, Snackbar), gehört in einen Effekt – nicht in den reinen UI-Aufbau.

Faustregeln

  • Schlüssel = Auslöser: Ändert sich der Schlüssel, startet der Effekt neu. Unit = genau einmal.
  • Automatisch aufgeräumt: Verlässt das Composable die Komposition, wird die Coroutine abgebrochen – kein Leak.
  • Nicht für UI-Zustand: Werte, die die Anzeige steuern, gehören in remember/State, nicht in einen Effekt.

Wenn du eine Android-App mit sauberem State- und Effekt-Handling brauchst, schreib mir.

Quellen

#Compose#LaunchedEffect#Coroutines#Android#Side-Effects

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 →