Interface

SaveableStateHolder

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()
            }
        }
    }
}