remember vs. rememberSaveable – Zustand, der die Drehung übersteht
remember hält Zustand über Recompositions, verliert ihn aber bei Konfigurationsänderungen wie der Bildschirmdrehung. rememberSaveable rettet einfache Werte automatisch über den Bundle-Mechanismus.
In Compose speicherst du lokalen UI-Zustand mit remember. Das reicht für Recompositions – aber es gibt eine Falle: Dreht der Nutzer das Gerät, wird die Activity neu erzeugt und der mit remember gehaltene Wert ist weg. Genau dafür gibt es rememberSaveable.
Der Unterschied in zwei Zeilen
@Composable
fun Counter() {
// Überlebt Recomposition – aber NICHT die Bildschirmdrehung:
var a by remember { mutableStateOf(0) }
// Überlebt Recomposition UND Konfigurationsänderung (Drehung, Sprache …):
var b by rememberSaveable { mutableStateOf(0) }
Column {
Button(onClick = { a++ }) { Text("remember: $a") }
Button(onClick = { b++ }) { Text("saveable: $b") }
}
}Zähl beide hoch, dreh das Gerät – a springt auf 0 zurück, b bleibt stehen.
Wie funktioniert das?
rememberSaveable legt den Wert im Bundle der Activity ab (derselbe Mechanismus wie onSaveInstanceState). Deshalb funktioniert es out-of-the-box nur für Typen, die ins Bundle passen: Int, String, Boolean, Parcelable usw.
Für eigene Klassen gibst du einen Saver mit:
data class Range(val from: Int, val to: Int)
val rangeSaver = listSaver<Range, Int>(
save = { listOf(it.from, it.to) },
restore = { Range(it[0], it[1]) }
)
var range by rememberSaveable(stateSaver = rangeSaver) {
mutableStateOf(Range(0, 10))
}Faustregel
remember– kurzlebiger UI-Zustand, der ruhig neu starten darf (z. B. ob ein Menü gerade offen ist).rememberSaveable– Zustand, den der Nutzer nach einer Drehung erwartet (Sucheingabe, ausgewählter Tab, Formularwerte).- ViewModel – alles, was die Drehung *und* eine kurze Weg-vom-Screen-Situation überleben soll oder Geschäftslogik enthält.
Du brauchst eine Android-App, deren Zustand sich in jeder Situation richtig verhält? 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
derivedStateOf – abgeleiteten Zustand berechnen, ohne Recompositions zu verschwenden
Wenn du aus einem sich schnell ändernden State einen selten wechselnden Wert ableitest (z. B. "Nach-oben-Button ab Item 5"), verhindert derivedStateOf, dass dein UI bei jedem Scroll-Pixel neu zeichnet.
collectAsStateWithLifecycle – Flows sammeln, ohne im Hintergrund zu verschwenden
collectAsState sammelt einen Flow auch, wenn die App im Hintergrund ist. collectAsStateWithLifecycle stoppt automatisch, sobald der Screen nicht mehr sichtbar ist – der richtige Standard für UI-State aus dem ViewModel.
Modifier-Reihenfolge in Compose – warum padding vor background alles ändert
In Jetpack Compose ist die Reihenfolge der Modifier keine Kosmetik, sondern Logik. background vor padding färbt auch den Rand ein, padding vor background nicht. Ein Beispiel, das den Groschen fallen lässt.