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
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
Room-Migrationen – das Schema ändern, ohne Nutzerdaten zu verlieren
Eine neue Spalte in der Entity, und beim nächsten Start ist der Spielstand weg – weil fallbackToDestructiveMigration die Datenbank einfach löscht. So machst du es richtig, inklusive Test.
stateIn und shareIn – aus einem kalten Flow wird geteilter Zustand
Jeder Sammler eines kalten Flows startet die Arbeit neu – zwei Beobachter, zwei Datenbankabfragen. stateIn und shareIn machen daraus einen Strom, den sich alle teilen, samt aktuellem Wert und Abschalten bei Inaktivität.
viewModelScope – Coroutinen, die mit dem Bildschirm verschwinden
Eine Coroutine, die nach dem Schließen des Bildschirms weiterläuft, schreibt in ein ViewModel, das niemand mehr sieht – und hält im schlimmsten Fall die ganze Activity im Speicher. viewModelScope beendet sie automatisch.