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
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.