From 182781cf19216d9dba6dc1fc1cad1e786d760aae Mon Sep 17 00:00:00 2001 From: jbwoods Date: Wed, 22 Oct 2025 18:32:04 +0000 Subject: [PATCH 1/2] Update to beta01 --- .../animations/AnimationSnippets.kt | 1 - .../navigation3/basic/BasicSnippets.kt | 1 - .../savingstate/SavingStateSnippets.kt | 8 ++-- .../navigation3/scenes/ScenesSnippets.kt | 40 ++++++++++--------- .../scenes/material/MaterialScenesSnippets.kt | 5 +-- gradle/libs.versions.toml | 10 ++--- 6 files changed, 31 insertions(+), 34 deletions(-) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/animations/AnimationSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/animations/AnimationSnippets.kt index 4def0c40b..2a6dcc036 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/animations/AnimationSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/animations/AnimationSnippets.kt @@ -33,7 +33,6 @@ import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.ui.Modifier import androidx.navigation3.runtime.NavKey -import androidx.navigation3.runtime.entry import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.ui.NavDisplay diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/basic/BasicSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/basic/BasicSnippets.kt index 38d76b123..bedb20aa7 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/basic/BasicSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/basic/BasicSnippets.kt @@ -22,7 +22,6 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.remember import androidx.navigation3.runtime.NavEntry -import androidx.navigation3.runtime.entry import androidx.navigation3.runtime.entryProvider import androidx.navigation3.ui.NavDisplay import com.example.compose.snippets.navigation3.ContentBlue diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/savingstate/SavingStateSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/savingstate/SavingStateSnippets.kt index 733191e39..5283e53c8 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/savingstate/SavingStateSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/savingstate/SavingStateSnippets.kt @@ -21,9 +21,8 @@ import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDe import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack -import androidx.navigation3.runtime.rememberSavedStateNavEntryDecorator +import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator import androidx.navigation3.ui.NavDisplay -import androidx.navigation3.ui.rememberSceneSetupNavEntryDecorator import kotlinx.serialization.Serializable // [START android_compose_navigation3_savingstate_1] @@ -44,9 +43,8 @@ fun ScopingViewModels() { // [START android_compose_navigation3_savingstate_2] NavDisplay( entryDecorators = listOf( - // Add the default decorators for managing scenes and saving state - rememberSceneSetupNavEntryDecorator(), - rememberSavedStateNavEntryDecorator(), + // Add the default decorators for saving state + rememberSaveableStateHolderNavEntryDecorator(), // Then add the view model store decorator rememberViewModelStoreNavEntryDecorator() ), diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/ScenesSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/ScenesSnippets.kt index 548a385d4..1c34fbccf 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/ScenesSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/ScenesSnippets.kt @@ -25,15 +25,17 @@ import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi import androidx.compose.material3.adaptive.currentWindowAdaptiveInfo import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey -import androidx.navigation3.runtime.entry import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack +import androidx.navigation3.scene.Scene +import androidx.navigation3.scene.SceneStrategy +import androidx.navigation3.scene.SceneStrategyScope import androidx.navigation3.ui.NavDisplay -import androidx.navigation3.ui.Scene -import androidx.navigation3.ui.SceneStrategy +import androidx.window.core.layout.WindowSizeClass import androidx.window.core.layout.WindowSizeClass.Companion.WIDTH_DP_MEDIUM_LOWER_BOUND import kotlinx.serialization.Serializable @@ -63,8 +65,7 @@ data class SinglePaneScene( * list. */ public class SinglePaneSceneStrategy : SceneStrategy { - @Composable - override fun calculateScene(entries: List>, onBack: (Int) -> Unit): Scene = + override fun SceneStrategyScope.calculateScene(entries: List>): Scene = SinglePaneScene( key = entries.last().contentKey, entry = entries.last(), @@ -106,20 +107,23 @@ class TwoPaneScene( } } +@Composable +fun rememberTwoPaneSceneStrategy() : TwoPaneSceneStrategy { + val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass + + return remember(windowSizeClass){ + TwoPaneSceneStrategy(windowSizeClass) + } +} + // --- TwoPaneSceneStrategy --- /** * A [SceneStrategy] that activates a [TwoPaneScene] if the window is wide enough * and the top two back stack entries declare support for two-pane display. */ -class TwoPaneSceneStrategy : SceneStrategy { +class TwoPaneSceneStrategy(val windowSizeClass: WindowSizeClass) : SceneStrategy { @OptIn(ExperimentalMaterial3AdaptiveApi::class, ExperimentalMaterial3WindowSizeClassApi::class) - @Composable - override fun calculateScene( - entries: List>, - onBack: (Int) -> Unit - ): Scene? { - - val windowSizeClass = currentWindowAdaptiveInfo().windowSizeClass + override fun SceneStrategyScope.calculateScene(entries: List>): Scene? { // Condition 1: Only return a Scene if the window is sufficiently wide to render two panes. // We use isWidthAtLeastBreakpoint with WIDTH_DP_MEDIUM_LOWER_BOUND (600dp). @@ -193,12 +197,10 @@ fun MyAppContent() { // ... other entries ... }, // Simply provide your custom strategy. NavDisplay will fall back to SinglePaneSceneStrategy automatically. - sceneStrategy = TwoPaneSceneStrategy(), - onBack = { count -> - repeat(count) { - if (backStack.isNotEmpty()) { - backStack.removeLastOrNull() - } + sceneStrategy = rememberTwoPaneSceneStrategy(), + onBack = { + if (backStack.isNotEmpty()) { + backStack.removeLastOrNull() } } ) diff --git a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/material/MaterialScenesSnippets.kt b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/material/MaterialScenesSnippets.kt index d71ab3f6b..e47a4ab2c 100644 --- a/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/material/MaterialScenesSnippets.kt +++ b/compose/snippets/src/main/java/com/example/compose/snippets/navigation3/scenes/material/MaterialScenesSnippets.kt @@ -31,7 +31,6 @@ import androidx.compose.material3.adaptive.navigation3.rememberListDetailSceneSt import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.navigation3.runtime.NavKey -import androidx.navigation3.runtime.entry import androidx.navigation3.runtime.entryProvider import androidx.navigation3.runtime.rememberNavBackStack import androidx.navigation3.ui.NavDisplay @@ -61,12 +60,12 @@ class MaterialListDetailActivity : ComponentActivity() { setContent { Scaffold { paddingValues -> val backStack = rememberNavBackStack(ProductList) - val listDetailStrategy = rememberListDetailSceneStrategy() + val listDetailStrategy = rememberListDetailSceneStrategy() NavDisplay( backStack = backStack, modifier = Modifier.padding(paddingValues), - onBack = { keysToRemove -> repeat(keysToRemove) { backStack.removeLastOrNull() } }, + onBack = { backStack.removeLastOrNull() }, sceneStrategy = listDetailStrategy, entryProvider = entryProvider { entry( diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 016c4f791..4d3e77686 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -17,10 +17,10 @@ androidx-credentials-play-services-auth = "1.5.0" androidx-emoji2-views = "1.5.0" androidx-fragment-ktx = "1.8.9" androidx-glance-appwidget = "1.1.1" -androidx-lifecycle-viewmodel-navigation3 = "1.0.0-alpha04" -androidx-navigation3 = "1.0.0-alpha09" -androidx-lifecycle-compose = "2.9.2" -androidx-lifecycle-runtime-compose = "2.9.2" +androidx-lifecycle-viewmodel-navigation3 = "2.10.0-beta01" +androidx-navigation3 = "1.0.0-beta01" +androidx-lifecycle-compose = "2.10.0-beta01" +androidx-lifecycle-runtime-compose = "2.10.0-beta01" androidx-navigation = "2.9.3" androidx-paging = "3.3.6" androidx-startup-runtime = "1.2.0" @@ -60,7 +60,7 @@ maps-compose = "6.7.2" material = "1.14.0-alpha03" material3-adaptive = "1.1.0" material3-adaptive-navigation-suite = "1.3.2" -material3-adaptive-navigation3 = "1.0.0-alpha02" +material3-adaptive-navigation3 = "1.3.0-alpha02" media3 = "1.8.0" # @keep minSdk = "35" From cef2ec496bc58ec262795f7ed73f2307341653e2 Mon Sep 17 00:00:00 2001 From: jbwoods Date: Wed, 22 Oct 2025 18:32:04 +0000 Subject: [PATCH 2/2] Update to beta01 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4d3e77686..c47fdfda6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -60,7 +60,7 @@ maps-compose = "6.7.2" material = "1.14.0-alpha03" material3-adaptive = "1.1.0" material3-adaptive-navigation-suite = "1.3.2" -material3-adaptive-navigation3 = "1.3.0-alpha02" +material3-adaptive-navigation3 = "1.3.0-alpha01" media3 = "1.8.0" # @keep minSdk = "35"