Skip to content

Commit b2cdbdc

Browse files
authored
Merge pull request #316 from android/dt/type-safe-nav-2
Snippet updates for type safe navigation APIs
2 parents 0442b19 + 750acf3 commit b2cdbdc

File tree

4 files changed

+28
-11
lines changed

4 files changed

+28
-11
lines changed

build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ plugins {
88
alias(libs.plugins.kapt) apply false
99
alias(libs.plugins.hilt) apply false
1010
alias(libs.plugins.kotlin.parcelize) apply false
11+
alias(libs.plugins.kotlin.serialization) apply false
1112
}
1213

1314
apply("${project.rootDir}/buildscripts/toml-updater-config.gradle")

compose/snippets/build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ plugins {
2020
alias(libs.plugins.kapt)
2121
alias(libs.plugins.hilt)
2222
alias(libs.plugins.kotlin.parcelize)
23+
alias(libs.plugins.kotlin.serialization)
2324
}
2425

2526
android {
@@ -83,7 +84,6 @@ dependencies {
8384
implementation(composeBom)
8485
androidTestImplementation(composeBom)
8586

86-
implementation(libs.androidx.compose.foundation)
8787
implementation(libs.androidx.compose.ui)
8888
implementation(libs.androidx.compose.ui.util)
8989
implementation(libs.androidx.compose.ui.graphics)
@@ -139,6 +139,7 @@ dependencies {
139139
implementation(libs.androidx.navigation.compose)
140140
implementation(libs.hilt.android)
141141
implementation(libs.androidx.hilt.navigation.compose)
142+
implementation(libs.kotlinx.serialization.json)
142143

143144
implementation(libs.androidx.recyclerview)
144145

compose/snippets/src/main/java/com/example/compose/snippets/interop/MigrationCommonScenariosSnippets.kt

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ import androidx.navigation.NavHostController
6464
import androidx.navigation.compose.NavHost
6565
import androidx.navigation.compose.composable
6666
import androidx.navigation.compose.rememberNavController
67+
import androidx.navigation.toRoute
6768
import androidx.recyclerview.widget.DividerItemDecoration
6869
import androidx.recyclerview.widget.LinearLayoutManager
6970
import androidx.recyclerview.widget.RecyclerView
7071
import kotlinx.coroutines.launch
72+
import kotlinx.serialization.Serializable
7173

7274
class RVActivity : ComponentActivity() {
7375
private lateinit var composeView: ComposeView
@@ -141,6 +143,13 @@ class SampleActivity : ComponentActivity() {
141143
}
142144
// [END android_compose_interop_migration_common_scenarios_navigation_step_2]
143145

146+
// [START android_compose_interop_migration_common_scenarios_navigation_step_2_1]
147+
@Serializable data object First
148+
@Serializable data class Second(val id: String)
149+
@Serializable data object Third
150+
151+
// [END android_compose_interop_migration_common_scenarios_navigation_step_2_1]
152+
144153
private object MigrationCommonScenariosNavigationStep3 {
145154
// [START android_compose_interop_migration_common_scenarios_navigation_step_3]
146155
@Composable
@@ -164,7 +173,7 @@ private object MigrationCommonScenariosNavigationStep4 {
164173
fun SampleNavHost(
165174
navController: NavHostController
166175
) {
167-
NavHost(navController = navController, startDestination = "first") {
176+
NavHost(navController = navController, startDestination = First) {
168177
// ...
169178
}
170179
}
@@ -191,11 +200,11 @@ class FirstFragment : Fragment() {
191200
fun SampleNavHost(
192201
navController: NavHostController
193202
) {
194-
NavHost(navController = navController, startDestination = "first") {
195-
composable("first") {
203+
NavHost(navController = navController, startDestination = First) {
204+
composable<First> {
196205
FirstScreen(/* ... */) // EXTRACT TO HERE
197206
}
198-
composable("second") {
207+
composable<Second> {
199208
SecondScreen(/* ... */)
200209
}
201210
// ...
@@ -220,20 +229,22 @@ private object MigrationCommonScenariosNavigationStep7 {
220229
fun SampleNavHost(
221230
navController: NavHostController
222231
) {
223-
NavHost(navController = navController, startDestination = "first") {
224-
composable("first") {
232+
NavHost(navController = navController, startDestination = First) {
233+
composable<First> {
225234
FirstScreen(
226235
onButtonClick = {
227236
// findNavController().navigate(firstScreenToSecondScreenAction)
228-
navController.navigate("second_screen_route")
237+
navController.navigate(Second(id = "ABC"))
229238
}
230239
)
231240
}
232-
composable("second") {
241+
composable<Second> { backStackEntry ->
242+
val secondRoute = backStackEntry.toRoute<Second>()
233243
SecondScreen(
244+
id = secondRoute.id,
234245
onIconClick = {
235246
// findNavController().navigate(secondScreenToThirdScreenAction)
236-
navController.navigate("third_screen_route")
247+
navController.navigate(Third)
237248
}
238249
)
239250
}
@@ -410,6 +421,7 @@ fun SampleApp() {
410421

411422
@Composable
412423
fun SecondScreen(
424+
id: String = "<no ID supplied>",
413425
onIconClick: () -> Unit = {},
414426
) {
415427
}

gradle/libs.versions.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ androidx-fragment-ktx = "1.6.2"
1414
androidx-glance-appwidget = "1.0.0"
1515
androidx-lifecycle-compose = "2.8.0-rc01"
1616
androidx-lifecycle-runtime-compose = "2.8.0-rc01"
17-
androidx-navigation = "2.7.7"
17+
androidx-navigation = "2.8.0-rc01"
1818
androidx-paging = "3.2.1"
1919
androidx-test = "1.5.0"
2020
androidx-test-espresso = "3.5.1"
@@ -34,6 +34,7 @@ horologist = "0.5.24"
3434
junit = "4.13.2"
3535
# @pin Update in conjuction with Compose Compiler
3636
kotlin = "1.9.20"
37+
kotlinxSerializationJson = "1.6.3"
3738
ksp = "1.8.0-1.0.9"
3839
maps-compose = "4.3.2"
3940
material = "1.4.0-beta01"
@@ -120,6 +121,7 @@ junit = { module = "junit:junit", version.ref = "junit" }
120121
kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin" }
121122
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
122123
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
124+
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerializationJson" }
123125
androidx-media3-common = { group = "androidx.media3", name = "media3-common", version.ref = "media3" }
124126
androidx-media3-exoplayer = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3" }
125127
play-services-wearable = { module = "com.google.android.gms:play-services-wearable", version.ref = "playServicesWearable" }
@@ -134,4 +136,5 @@ hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
134136
kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
135137
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
136138
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }
139+
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
137140
version-catalog-update = { id = "nl.littlerobots.version-catalog-update", version.ref = "version-catalog-update" }

0 commit comments

Comments
 (0)