Set up Navigation 3 for the DocuBox Compose Multiplatform project.
This project uses Compose Multiplatform 1.10.0 which supports Navigation 3.
Steps
- •
Read
gradle/libs.versions.tomland add the navigation dependencies:Under
[versions]:codenavigation3-ui = "1.0.0-alpha05" lifecycle-viewmodel-navigation3 = "2.10.0-alpha05"
Under
[libraries]:codenavigation3-ui = { module = "org.jetbrains.androidx.navigation3:navigation3-ui", version.ref = "navigation3-ui" } lifecycle-viewmodel-navigation3 = { module = "org.jetbrains.androidx.lifecycle:lifecycle-viewmodel-navigation3", version.ref = "lifecycle-viewmodel-navigation3" }Important: Before adding, search the web for the latest stable version of these libraries. Use latest stable — no alpha/beta unless no stable exists yet (Navigation 3 is currently alpha-only, so alpha is acceptable here).
- •
Read
composeApp/build.gradle.ktsand add tocommonMain.dependencies:kotlinimplementation(libs.navigation3.ui) implementation(libs.lifecycle.viewmodel.navigation3)
Also ensure
kotlinx-serializationplugin is applied (needed for type-safe routes):- •Add serialization plugin in
[plugins]of version catalog if missing - •Apply it in
composeApp/build.gradle.kts - •Add
kotlinx-serialization-coreto commonMain dependencies
- •Add serialization plugin in
- •
Create the navigation setup at
composeApp/src/commonMain/kotlin/io/ak1/docubox/navigation/:NavRoutes.kt — Define routes as serializable data objects/classes:
kotlin@Serializable data object HomeRoute : NavKey @Serializable data class DetailRoute(val id: String) : NavKey
NavConfig.kt — SavedStateConfiguration with polymorphic serialization (required for iOS/non-JVM):
kotlinval navConfig = SavedStateConfiguration { serializersModule = SerializersModule { polymorphic(NavKey::class) { subclass(HomeRoute::class) subclass(DetailRoute::class) } } }AppNavigation.kt — Main navigation composable using
rememberNavBackStackandNavDisplay - •
Update
App.ktto use the new navigation composable as root. - •
Verify the build compiles on both platforms:
code./gradlew :composeApp:assembleDebug ./gradlew :composeApp:iosSimulatorArm64MainKotlinNativeCompile
Key rules
- •All route classes must implement
NavKeyand be@Serializable - •Register every route in the
SavedStateConfigurationpolymorphic block (required for iOS) - •Use
rememberNavBackStackfor back stack management — manipulate it directly to navigate - •Do not use the old
navigation-compose(org.jetbrains.androidx.navigation:navigation-compose) — Navigation 3 is the current approach for Compose Multiplatform 1.10.0+