Allows to save the state defined with [rememberSaveable] for the subtree before disposing it to make it possible to compose it back next time with the restored state.
SimpleNavigationWithSaveableStateSample
@Composable
fun SimpleNavigationWithSaveableStateSample() {
@Composable
fun <T : Any> Navigation(
currentScreen: T,
modifier: Modifier = Modifier,
content: @Composable (T) -> Unit,
) {
// create SaveableStateHolder.
val saveableStateHolder = rememberSaveableStateHolder()
Box(modifier) {
// Wrap the content representing the `currentScreen` inside `SaveableStateProvider`.
// Here you can also add a screen switch animation like Crossfade where during the
// animation multiple screens will be displayed at the same time.
saveableStateHolder.SaveableStateProvider(currentScreen) { content(currentScreen) }
}
}
Column {
var screen by rememberSaveable { mutableStateOf("screen1") }
Row(horizontalArrangement = Arrangement.SpaceEvenly) {
Button(onClick = { screen = "screen1" }) { Text("Go to screen1") }
Button(onClick = { screen = "screen2" }) { Text("Go to screen2") }
}
Navigation(screen, Modifier.fillMaxSize()) { currentScreen ->
if (currentScreen == "screen1") {
Screen1()
} else {
Screen2()
}
}
}
}