Skip to content

Commit

Permalink
Replace providesDefault in Navigator with provides and an if-check
Browse files Browse the repository at this point in the history
  • Loading branch information
hristogochev authored and Vodes committed Dec 17, 2024
1 parent d140871 commit 8318c66
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,7 @@ public fun Navigator(
require(screens.isNotEmpty()) { "Navigator must have at least one screen" }
require(key.isNotEmpty()) { "Navigator key can't be empty" }

CompositionLocalProvider(
LocalNavigatorStateHolder providesDefault rememberSaveableStateHolder()
) {
ConditionalLocalNavigationStateHolderCompositionLocalProvider {
val navigator = rememberNavigator(screens, key, disposeBehavior, LocalNavigator.current)

if (navigator.parent?.disposeBehavior?.disposeNestedNavigators != false) {
Expand Down Expand Up @@ -177,3 +175,18 @@ public data class NavigatorDisposeBehavior(
public fun compositionUniqueId(): String = currentCompositeKeyHash.toString(MaxSupportedRadix)

private val MaxSupportedRadix = 36

@Composable
private fun ConditionalLocalNavigationStateHolderCompositionLocalProvider(content: @Composable () -> Unit) {
val navigatorStateHolder = LocalNavigatorStateHolder.current

if (navigatorStateHolder == null) {
CompositionLocalProvider(
LocalNavigatorStateHolder provides rememberSaveableStateHolder(),
) {
content()
}
} else {
content()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import cafe.adriel.voyager.navigator.LocalNavigatorSaver
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior

internal val LocalNavigatorStateHolder: ProvidableCompositionLocal<SaveableStateHolder> =
staticCompositionLocalOf { error("LocalNavigatorStateHolder not initialized") }
internal val LocalNavigatorStateHolder: ProvidableCompositionLocal<SaveableStateHolder?> =
staticCompositionLocalOf { null }

@Composable
internal fun rememberNavigator(
Expand All @@ -21,7 +21,7 @@ internal fun rememberNavigator(
disposeBehavior: NavigatorDisposeBehavior,
parent: Navigator?
): Navigator {
val stateHolder = LocalNavigatorStateHolder.current
val stateHolder = LocalNavigatorStateHolder.current ?: error("LocalNavigatorStateHolder not initialized")
val navigatorSaver = LocalNavigatorSaver.current
val saver = remember(navigatorSaver, stateHolder, parent, disposeBehavior) {
navigatorSaver.saver(screens, key, stateHolder, disposeBehavior, parent)
Expand Down

0 comments on commit 8318c66

Please sign in to comment.