Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ artifactRedirection.version.androidx.annotation=1.9.1
artifactRedirection.version.androidx.graphics=1.1.0-alpha01
artifactRedirection.version.androidx.lifecycle=2.10.0
artifactRedirection.version.androidx.navigation=2.9.1
artifactRedirection.version.androidx.navigation3=1.0.0-rc01
artifactRedirection.version.androidx.navigation3=1.1.0-alpha01
artifactRedirection.version.androidx.navigationevent=1.0.0-rc01
artifactRedirection.version.androidx.performance=1.0.0-alpha01
artifactRedirection.version.androidx.savedstate=1.4.0
Expand Down
2 changes: 1 addition & 1 deletion libraryversions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ MEDIA = "1.7.0-rc01"
MEDIAROUTER = "1.8.0-alpha01"
METRICS = "1.0.0-beta02"
NAVIGATION = "2.9.1"
NAVIGATION3 = "1.0.0-rc01"
NAVIGATION3 = "1.1.0-alpha01"
NAVIGATIONEVENT = "1.0.0-rc01"
PAGING = "3.4.0-alpha01"
PALETTE = "1.1.0-alpha01"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,35 +21,60 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.saveable.rememberSerializable
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.samples.NavBackStackSamples.MultiBackStack
import androidx.navigation3.runtime.samples.NavBackStackSamples.Chat
import androidx.navigation3.runtime.samples.NavBackStackSamples.Home
import androidx.navigation3.runtime.samples.NavBackStackSamples.SealedKey
import androidx.navigation3.runtime.samples.NavBackStackSamples.Spaces
import androidx.savedstate.serialization.SavedStateConfiguration
import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass
import kotlinx.serialization.serializer

object NavBackStackSamples {

// --- Open Polymorphism ---
@Serializable open class Home : NavKey

@Serializable open class Chat : NavKey

@Serializable open class Spaces : NavKey

// --- Closed Polymorphism ---
@Serializable
class MultiBackStack(
val homeTabStack: NavBackStack<Home>,
val chatTabStack: NavBackStack<Chat>,
val spacesTabStack: NavBackStack<Spaces>,
)
sealed class SealedKey : NavKey {

@Serializable class Inbox : SealedKey()

@Serializable class Settings : SealedKey()
}
}

@Composable
@Sampled
fun NavBackStack_OpenPolymorphism() {
// https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#open-polymorphism
rememberSerializable(
serializer = serializer(),
configuration =
SavedStateConfiguration {
serializersModule = SerializersModule {
polymorphic(baseClass = NavKey::class) {
subclass(clazz = Home::class)
subclass(clazz = Chat::class)
subclass(clazz = Spaces::class)
}
}
},
) {
NavBackStack<NavKey>()
}
}

@Composable
@Sampled
fun NavBackStack_Serializer() {
val multiBackStack =
rememberSerializable(serializer = serializer()) {
MultiBackStack(
homeTabStack = NavBackStack(),
chatTabStack = NavBackStack(),
spacesTabStack = NavBackStack(),
)
}
fun NavBackStack_ClosedPolymorphism() {
// https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/polymorphism.md#closed-polymorphism
rememberSerializable(serializer = serializer()) { NavBackStack<SealedKey>() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ import androidx.annotation.Sampled
import androidx.compose.runtime.Composable
import androidx.navigation3.runtime.NavBackStack
import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.samples.RememberNavBackStackSamples.Details
import androidx.navigation3.runtime.samples.RememberNavBackStackSamples.Home
import androidx.navigation3.runtime.samples.RememberNavBackStackSamples.Screen
import androidx.navigation3.runtime.samples.NavBackStackSerializerSamples.Details
import androidx.navigation3.runtime.samples.NavBackStackSerializerSamples.Home
import androidx.navigation3.runtime.serialization.NavBackStackSerializer
import androidx.savedstate.serialization.SavedStateConfiguration
import androidx.savedstate.serialization.decodeFromSavedState
Expand All @@ -32,21 +31,19 @@ import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass

object NavBackStackSerializerSamples {
private object NavBackStackSerializerSamples {

@Serializable open class Screen : NavKey
@Serializable open class Home(val id: String) : NavKey

@Serializable open class Home(val id: String) : Screen()

@Serializable open class Details(val itemId: Long) : Screen()
@Serializable open class Details(val itemId: Long) : NavKey
}

@Composable
@Sampled
fun NavBackStackSerializer_withReflection() {
// On Android, the no-argument overload uses reflection and requires no configuration.
// This will throw a runtime exception on non-Android platforms during serialization.
val serializer = NavBackStackSerializer<Screen>()
val serializer = NavBackStackSerializer<NavKey>()

val backStack = NavBackStack(Home("abc"), Details(42))
val encoded = encodeToSavedState(serializer, backStack)
Expand All @@ -57,14 +54,14 @@ fun NavBackStackSerializer_withReflection() {
@Sampled
fun NavBackStackSerializer_withSerializersModule() {
val module = SerializersModule {
polymorphic(Screen::class) {
polymorphic(NavKey::class) {
subclass(Home.serializer())
subclass(Details.serializer())
}
}
val configuration = SavedStateConfiguration { serializersModule = module }

val serializer = NavBackStackSerializer<Screen>()
val serializer = NavBackStackSerializer<NavKey>()

// Pass the same configuration (or at least its serializersModule) to encode/decode:
val backStack = NavBackStack(Home("abc"), Details(42))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,17 @@ import androidx.navigation3.runtime.NavKey
import androidx.navigation3.runtime.rememberNavBackStack
import androidx.navigation3.runtime.samples.RememberNavBackStackSamples.Details
import androidx.navigation3.runtime.samples.RememberNavBackStackSamples.Home
import androidx.navigation3.runtime.samples.RememberNavBackStackSamples.Screen
import androidx.savedstate.serialization.SavedStateConfiguration
import kotlinx.serialization.Serializable
import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.polymorphic
import kotlinx.serialization.modules.subclass

object RememberNavBackStackSamples {
private object RememberNavBackStackSamples {

@Serializable open class Screen : NavKey
@Serializable open class Home(val id: String) : NavKey

@Serializable open class Home(val id: String) : Screen()

@Serializable open class Details(val itemId: Long) : Screen()
@Serializable open class Details(val itemId: Long) : NavKey
}

@Composable
Expand All @@ -51,7 +48,7 @@ fun rememberNavBackStack_withSerializersModule() {
val config = SavedStateConfiguration {
// Register subtypes for open polymorphism or multiplatform use.
serializersModule = SerializersModule {
polymorphic(baseClass = Screen::class) {
polymorphic(baseClass = NavKey::class) {
subclass(serializer = Home.serializer())
subclass(serializer = Details.serializer())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ import kotlinx.serialization.Serializable
* backStack.removeLast() // pops stack
* ```
*
* @sample androidx.navigation3.runtime.samples.NavBackStack_Serializer
* @sample androidx.navigation3.runtime.samples.NavBackStack_OpenPolymorphism
* @sample androidx.navigation3.runtime.samples.NavBackStack_ClosedPolymorphism
* @constructor Creates a new back stack backed by the provided [SnapshotStateList].
* @see rememberNavBackStack for lifecycle-aware persistence.
*/
Expand Down
Loading