Migrate Interests nested NavHost to safe args

Change-Id: I4f3c310be693ecbcbc8b99c4e573d7fc6e9a2f74
dt/nav-safe-args
Don Turner 2 months ago
parent 6dc59e7016
commit d96bcf8ffe

@ -25,6 +25,10 @@ plugins {
id("com.google.android.gms.oss-licenses-plugin")
alias(libs.plugins.baselineprofile)
alias(libs.plugins.roborazzi)
// Serialization is used for type-safe navigation.
// TODO: Use the plugin ID from the version catalog when
// https://github.com/gradle/gradle/issues/15383# is resolved
id("org.jetbrains.kotlin.plugin.serialization")
}
android {
@ -103,6 +107,7 @@ dependencies {
implementation(libs.androidx.window.core)
implementation(libs.kotlinx.coroutines.guava)
implementation(libs.coil.kt)
implementation(libs.kotlinx.serialization.json)
ksp(libs.hilt.compiler)

@ -38,11 +38,13 @@ import com.google.samples.apps.nowinandroid.feature.interests.InterestsRoute
import com.google.samples.apps.nowinandroid.feature.interests.navigation.INTERESTS_ROUTE
import com.google.samples.apps.nowinandroid.feature.interests.navigation.TOPIC_ID_ARG
import com.google.samples.apps.nowinandroid.feature.topic.TopicDetailPlaceholder
import com.google.samples.apps.nowinandroid.feature.topic.navigation.TOPIC_ROUTE
import com.google.samples.apps.nowinandroid.feature.topic.navigation.navigateToTopic
import com.google.samples.apps.nowinandroid.feature.topic.navigation.topicScreen
import kotlinx.serialization.Serializable
private const val DETAIL_PANE_NAVHOST_ROUTE = "detail_pane_route"
@Serializable object TopicPlaceholderDestination
@Serializable object DetailPaneNavHostDestination
fun NavGraphBuilder.interestsListDetailScreen() {
composable(
@ -86,7 +88,7 @@ internal fun InterestsListDetailScreen(
fun onTopicClickShowDetailPane(topicId: String) {
onTopicClick(topicId)
nestedNavController.navigateToTopic(topicId) {
popUpTo(DETAIL_PANE_NAVHOST_ROUTE)
popUpTo<DetailPaneNavHostDestination>()
}
listDetailNavigator.navigateTo(ListDetailPaneScaffoldRole.Detail)
}
@ -103,15 +105,15 @@ internal fun InterestsListDetailScreen(
detailPane = {
NavHost(
navController = nestedNavController,
startDestination = TOPIC_ROUTE,
route = DETAIL_PANE_NAVHOST_ROUTE,
) {
startDestination = TopicPlaceholderDestination::class,
route = DetailPaneNavHostDestination::class
){
topicScreen(
showBackButton = !listDetailNavigator.isListPaneVisible(),
onBackClick = listDetailNavigator::navigateBack,
onTopicClick = ::onTopicClickShowDetailPane,
)
composable(route = TOPIC_ROUTE) {
composable<TopicPlaceholderDestination> {
TopicDetailPlaceholder()
}
}

@ -71,7 +71,7 @@ import com.google.samples.apps.nowinandroid.core.ui.userNewsResourceCardItems
import com.google.samples.apps.nowinandroid.feature.topic.R.string
@Composable
internal fun TopicRoute(
internal fun TopicScreen(
showBackButton: Boolean,
onBackClick: () -> Unit,
onTopicClick: (String) -> Unit,

@ -21,7 +21,7 @@ import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptionsBuilder
import androidx.navigation.compose.composable
import com.google.samples.apps.nowinandroid.feature.topic.TopicRoute
import com.google.samples.apps.nowinandroid.feature.topic.TopicScreen
import kotlinx.serialization.Serializable
// TODO: Remove
@ -29,11 +29,10 @@ import kotlinx.serialization.Serializable
internal const val TOPIC_ID_ARG = "topicId"
const val TOPIC_ROUTE = "topic_route"
@Serializable
data class TopicDestination(val id: String)
@Serializable data class TopicDestination(val id: String)
fun NavController.navigateToTopic(topicId: String, navOptions: NavOptionsBuilder.() -> Unit = {}) {
navigate(TopicDestination(topicId)) {
navigate(route = TopicDestination(topicId)) {
navOptions()
}
}
@ -44,7 +43,7 @@ fun NavGraphBuilder.topicScreen(
onTopicClick: (String) -> Unit,
) {
composable<TopicDestination> {
TopicRoute(
TopicScreen(
showBackButton = showBackButton,
onBackClick = onBackClick,
onTopicClick = onTopicClick,

Loading…
Cancel
Save