DisposableEffect in Compose – aufräumen, wenn ein Composable verschwindet
Immer wenn du in Compose etwas registrierst – einen Listener, einen Sensor, einen Callback – musst du es auch wieder abmelden. Genau dafür gibt es DisposableEffect mit seinem onDispose-Block.
LaunchedEffect kennst du vielleicht schon – der ist für Coroutinen beim Erscheinen eines Composables. Aber was, wenn du etwas registrierst, das du später wieder abmelden musst: einen BroadcastReceiver, einen Sensor-Listener, einen NetworkCallback? Meldest du ihn nicht ab, läuft er weiter, hält Referenzen fest und leakt Speicher. Genau dafür gibt es DisposableEffect – mit einem onDispose-Block, der garantiert aufräumt.
Registrieren und sauber wieder abmelden
Ein Beispiel, das den Online-Status des Geräts beobachtet:
@Composable
fun rememberIsOnline(): State<Boolean> {
val context = LocalContext.current
val isOnline = remember { mutableStateOf(true) }
DisposableEffect(context) {
val cm = context.getSystemService(ConnectivityManager::class.java)
val callback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) { isOnline.value = true }
override fun onLost(network: Network) { isOnline.value = false }
}
cm.registerDefaultNetworkCallback(callback) // anmelden
onDispose {
cm.unregisterNetworkCallback(callback) // WIEDER abmelden!
}
}
return isOnline
}Im UI nutzt du das dann ganz normal:
val online by rememberIsOnline()
if (!online) {
Text("Keine Verbindung", color = MaterialTheme.colorScheme.error)
}Was genau passiert – und wann
onDisposeläuft immer, wenn der Composable die Komposition verlässt (der Screen wird verlassen) oder bevor der Effekt wegen geänderter Keys neu startet. So bleibt kein Callback zurück.- Die Keys steuern den Neustart.
DisposableEffect(context)startet neu (erstonDispose, dann neu registrieren), sobald sichcontextändert. Brauchst du „genau einmal beim Erscheinen", nimm einen konstanten Key wieDisposableEffect(Unit). onDisposemuss die letzte Anweisung sein – der Compiler erzwingt das. Da hinein gehört ausschließlich das Aufräumen.
Die Faustregel: LaunchedEffect für Coroutinen-Arbeit (laden, beobachten), DisposableEffect immer dann, wenn es zu deiner Anmeldung ein passendes „Abmelden" gibt.
Du willst eine Android-App ohne Speicherlecks und mit sauberem Lebenszyklus? Ich helfe dir weiter.
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
kotlinx.serialization: JSON und data class ohne Handarbeit verbinden
Eine API antwortet mit JSON, deine App will eine data class. Dazwischen steht in vielen Projekten ein handgeschriebener Parser. Mit kotlinx.serialization sind es eine Annotation und eine Zeile – und ein Schalter, ohne den deine App beim nächsten API-Update abstürzt.
callbackFlow – Listener-APIs in einen Flow verwandeln
Android steckt voller Callback-APIs mit `register`/`unregister`. Mit `callbackFlow` machst du daraus einen ganz normalen Flow – inklusive automatischem Abmelden, wenn niemand mehr zuhört.
AnimatedVisibility in Jetpack Compose – ein- und ausblenden, das nicht springt
Ein Element einfach mit if wegzulassen, poppt hart weg. AnimatedVisibility blendet es weich ein und aus – mit sinnvollen Voreinstellungen und, wenn du willst, deiner eigenen Kombination aus Faden und Bewegung. Ich zeige dir beides.