Skip to content

Commit d7ab592

Browse files
committed
Migrate to Navigation3
1 parent 460a3ae commit d7ab592

File tree

9 files changed

+245
-171
lines changed

9 files changed

+245
-171
lines changed

JetNews/app/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2020
plugins {
2121
alias(libs.plugins.android.application)
2222
alias(libs.plugins.compose)
23+
alias(libs.plugins.kotlin.serialization)
2324
}
2425

2526
android {
@@ -92,6 +93,7 @@ dependencies {
9293

9394
implementation(libs.kotlin.stdlib)
9495
implementation(libs.kotlinx.coroutines.android)
96+
implementation(libs.kotlinx.serialization.core)
9597

9698
implementation(libs.androidx.compose.animation)
9799
implementation(libs.androidx.compose.foundation.layout)
@@ -116,7 +118,9 @@ dependencies {
116118
implementation(libs.androidx.lifecycle.livedata.ktx)
117119
implementation(libs.androidx.lifecycle.viewModelCompose)
118120
implementation(libs.androidx.lifecycle.runtime.compose)
121+
implementation(libs.androidx.lifecycle.viewmodel.navigation3)
119122
implementation(libs.androidx.navigation.compose)
123+
implementation(libs.androidx.navigation3.ui)
120124
implementation(libs.androidx.window)
121125

122126
androidTestImplementation(libs.junit)

JetNews/app/src/main/java/com/example/jetnews/ui/AppDrawer.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,16 @@ import androidx.compose.ui.res.painterResource
3636
import androidx.compose.ui.res.stringResource
3737
import androidx.compose.ui.tooling.preview.Preview
3838
import androidx.compose.ui.unit.dp
39+
import androidx.navigation3.runtime.NavKey
3940
import com.example.jetnews.R
41+
import com.example.jetnews.ui.navigation.Home
42+
import com.example.jetnews.ui.navigation.Interests
4043
import com.example.jetnews.ui.theme.JetnewsTheme
4144

4245
@Composable
4346
fun AppDrawer(
4447
drawerState: DrawerState,
45-
currentRoute: String,
48+
currentKey: NavKey,
4649
navigateToHome: () -> Unit,
4750
navigateToInterests: () -> Unit,
4851
closeDrawer: () -> Unit,
@@ -58,7 +61,7 @@ fun AppDrawer(
5861
NavigationDrawerItem(
5962
label = { Text(stringResource(id = R.string.home_title)) },
6063
icon = { Icon(painterResource(R.drawable.ic_home), null) },
61-
selected = currentRoute == JetnewsDestinations.HOME_ROUTE,
64+
selected = currentKey is Home,
6265
onClick = {
6366
navigateToHome()
6467
closeDrawer()
@@ -68,7 +71,7 @@ fun AppDrawer(
6871
NavigationDrawerItem(
6972
label = { Text(stringResource(id = R.string.interests_title)) },
7073
icon = { Icon(painterResource(R.drawable.ic_list_alt), null) },
71-
selected = currentRoute == JetnewsDestinations.INTERESTS_ROUTE,
74+
selected = currentKey == Interests,
7275
onClick = {
7376
navigateToInterests()
7477
closeDrawer()
@@ -102,7 +105,7 @@ fun PreviewAppDrawer() {
102105
JetnewsTheme {
103106
AppDrawer(
104107
drawerState = rememberDrawerState(initialValue = DrawerValue.Open),
105-
currentRoute = JetnewsDestinations.HOME_ROUTE,
108+
currentKey = Home(),
106109
navigateToHome = {},
107110
navigateToInterests = {},
108111
closeDrawer = { },

JetNews/app/src/main/java/com/example/jetnews/ui/JetnewsApp.kt

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,40 +23,35 @@ import androidx.compose.material3.ModalNavigationDrawer
2323
import androidx.compose.material3.rememberDrawerState
2424
import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass
2525
import androidx.compose.runtime.Composable
26-
import androidx.compose.runtime.getValue
2726
import androidx.compose.runtime.remember
2827
import androidx.compose.runtime.rememberCoroutineScope
29-
import androidx.navigation.compose.currentBackStackEntryAsState
30-
import androidx.navigation.compose.rememberNavController
3128
import com.example.jetnews.data.AppContainer
3229
import com.example.jetnews.ui.components.AppNavRail
30+
import com.example.jetnews.ui.navigation.JetnewsNavDisplay
31+
import com.example.jetnews.ui.navigation.NavigationState
32+
import com.example.jetnews.ui.navigation.Navigator
33+
import com.example.jetnews.ui.navigation.rememberNavigationState
3334
import com.example.jetnews.ui.theme.JetnewsTheme
3435
import kotlinx.coroutines.launch
3536

3637
@Composable
3738
fun JetnewsApp(appContainer: AppContainer, widthSizeClass: WindowWidthSizeClass) {
3839
JetnewsTheme {
39-
val navController = rememberNavController()
40-
val navigationActions = remember(navController) {
41-
JetnewsNavigationActions(navController)
42-
}
43-
4440
val coroutineScope = rememberCoroutineScope()
4541

46-
val navBackStackEntry by navController.currentBackStackEntryAsState()
47-
val currentRoute =
48-
navBackStackEntry?.destination?.route ?: JetnewsDestinations.HOME_ROUTE
49-
5042
val isExpandedScreen = widthSizeClass == WindowWidthSizeClass.Expanded
5143
val sizeAwareDrawerState = rememberSizeAwareDrawerState(isExpandedScreen)
5244

45+
val navigationState = rememberNavigationState()
46+
val navigator = Navigator(navigationState)
47+
5348
ModalNavigationDrawer(
5449
drawerContent = {
5550
AppDrawer(
5651
drawerState = sizeAwareDrawerState,
57-
currentRoute = currentRoute,
58-
navigateToHome = navigationActions.navigateToHome,
59-
navigateToInterests = navigationActions.navigateToInterests,
52+
currentKey = navigationState.currentKey,
53+
navigateToHome = navigator::toHome,
54+
navigateToInterests = navigator::toInterests,
6055
closeDrawer = { coroutineScope.launch { sizeAwareDrawerState.close() } },
6156
)
6257
},
@@ -67,15 +62,16 @@ fun JetnewsApp(appContainer: AppContainer, widthSizeClass: WindowWidthSizeClass)
6762
Row {
6863
if (isExpandedScreen) {
6964
AppNavRail(
70-
currentRoute = currentRoute,
71-
navigateToHome = navigationActions.navigateToHome,
72-
navigateToInterests = navigationActions.navigateToInterests,
65+
currentKey = navigationState.currentKey,
66+
navigateToHome = navigator::toHome,
67+
navigateToInterests = navigator::toInterests,
7368
)
7469
}
75-
JetnewsNavGraph(
70+
JetnewsNavDisplay(
71+
navigationState = navigationState,
7672
appContainer = appContainer,
73+
onBack = navigator::pop,
7774
isExpandedScreen = isExpandedScreen,
78-
navController = navController,
7975
openDrawer = { coroutineScope.launch { sizeAwareDrawerState.open() } },
8076
)
8177
}

JetNews/app/src/main/java/com/example/jetnews/ui/JetnewsNavGraph.kt

Lines changed: 0 additions & 82 deletions
This file was deleted.

JetNews/app/src/main/java/com/example/jetnews/ui/JetnewsNavigation.kt

Lines changed: 0 additions & 58 deletions
This file was deleted.

JetNews/app/src/main/java/com/example/jetnews/ui/components/AppNavRail.kt

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,14 @@ import androidx.compose.ui.res.painterResource
3030
import androidx.compose.ui.res.stringResource
3131
import androidx.compose.ui.tooling.preview.Preview
3232
import androidx.compose.ui.unit.dp
33+
import androidx.navigation3.runtime.NavKey
3334
import com.example.jetnews.R
34-
import com.example.jetnews.ui.JetnewsDestinations
35+
import com.example.jetnews.ui.navigation.Home
36+
import com.example.jetnews.ui.navigation.Interests
3537
import com.example.jetnews.ui.theme.JetnewsTheme
3638

3739
@Composable
38-
fun AppNavRail(currentRoute: String, navigateToHome: () -> Unit, navigateToInterests: () -> Unit, modifier: Modifier = Modifier) {
40+
fun AppNavRail(currentKey: NavKey, navigateToHome: () -> Unit, navigateToInterests: () -> Unit, modifier: Modifier = Modifier) {
3941
NavigationRail(
4042
header = {
4143
Icon(
@@ -49,14 +51,14 @@ fun AppNavRail(currentRoute: String, navigateToHome: () -> Unit, navigateToInter
4951
) {
5052
Spacer(Modifier.weight(1f))
5153
NavigationRailItem(
52-
selected = currentRoute == JetnewsDestinations.HOME_ROUTE,
54+
selected = currentKey is Home,
5355
onClick = navigateToHome,
5456
icon = { Icon(painterResource(id = R.drawable.ic_home), stringResource(R.string.home_title)) },
5557
label = { Text(stringResource(R.string.home_title)) },
5658
alwaysShowLabel = false,
5759
)
5860
NavigationRailItem(
59-
selected = currentRoute == JetnewsDestinations.INTERESTS_ROUTE,
61+
selected = currentKey == Interests,
6062
onClick = navigateToInterests,
6163
icon = { Icon(painterResource(id = R.drawable.ic_list_alt), stringResource(R.string.interests_title)) },
6264
label = { Text(stringResource(R.string.interests_title)) },
@@ -72,7 +74,7 @@ fun AppNavRail(currentRoute: String, navigateToHome: () -> Unit, navigateToInter
7274
fun PreviewAppNavRail() {
7375
JetnewsTheme {
7476
AppNavRail(
75-
currentRoute = JetnewsDestinations.HOME_ROUTE,
77+
currentKey = Home(),
7678
navigateToHome = {},
7779
navigateToInterests = {},
7880
)

0 commit comments

Comments
 (0)