Skip to content

Commit 8318c66

Browse files
hristogochevVodes
authored andcommitted
Replace providesDefault in Navigator with provides and an if-check
1 parent d140871 commit 8318c66

File tree

2 files changed

+19
-6
lines changed

2 files changed

+19
-6
lines changed

voyager-navigator/src/commonMain/kotlin/cafe/adriel/voyager/navigator/Navigator.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ public fun Navigator(
6464
require(screens.isNotEmpty()) { "Navigator must have at least one screen" }
6565
require(key.isNotEmpty()) { "Navigator key can't be empty" }
6666

67-
CompositionLocalProvider(
68-
LocalNavigatorStateHolder providesDefault rememberSaveableStateHolder()
69-
) {
67+
ConditionalLocalNavigationStateHolderCompositionLocalProvider {
7068
val navigator = rememberNavigator(screens, key, disposeBehavior, LocalNavigator.current)
7169

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

179177
private val MaxSupportedRadix = 36
178+
179+
@Composable
180+
private fun ConditionalLocalNavigationStateHolderCompositionLocalProvider(content: @Composable () -> Unit) {
181+
val navigatorStateHolder = LocalNavigatorStateHolder.current
182+
183+
if (navigatorStateHolder == null) {
184+
CompositionLocalProvider(
185+
LocalNavigatorStateHolder provides rememberSaveableStateHolder(),
186+
) {
187+
content()
188+
}
189+
} else {
190+
content()
191+
}
192+
}

voyager-navigator/src/commonMain/kotlin/cafe/adriel/voyager/navigator/internal/NavigatorSaverInternal.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import cafe.adriel.voyager.navigator.LocalNavigatorSaver
1111
import cafe.adriel.voyager.navigator.Navigator
1212
import cafe.adriel.voyager.navigator.NavigatorDisposeBehavior
1313

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

1717
@Composable
1818
internal fun rememberNavigator(
@@ -21,7 +21,7 @@ internal fun rememberNavigator(
2121
disposeBehavior: NavigatorDisposeBehavior,
2222
parent: Navigator?
2323
): Navigator {
24-
val stateHolder = LocalNavigatorStateHolder.current
24+
val stateHolder = LocalNavigatorStateHolder.current ?: error("LocalNavigatorStateHolder not initialized")
2525
val navigatorSaver = LocalNavigatorSaver.current
2626
val saver = remember(navigatorSaver, stateHolder, parent, disposeBehavior) {
2727
navigatorSaver.saver(screens, key, stateHolder, disposeBehavior, parent)

0 commit comments

Comments
 (0)