Skip to content

Commit 7e7bb17

Browse files
committed
Use Compose typed navigation
1 parent 013fba6 commit 7e7bb17

File tree

5 files changed

+35
-22
lines changed

5 files changed

+35
-22
lines changed

composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/App.kt

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import androidx.navigation.NavHostController
1010
import androidx.navigation.compose.NavHost
1111
import androidx.navigation.compose.composable
1212
import androidx.navigation.compose.rememberNavController
13+
import androidx.navigation.toRoute
14+
import com.jetbrains.kmpapp.screens.detail.DetailDestination
1315
import com.jetbrains.kmpapp.screens.detail.DetailScreen
16+
import com.jetbrains.kmpapp.screens.list.ListDestination
1417
import com.jetbrains.kmpapp.screens.list.ListScreen
1518

1619
@Composable
@@ -20,16 +23,19 @@ fun App() {
2023
) {
2124
Surface {
2225
val navController: NavHostController = rememberNavController()
23-
NavHost(
24-
navController,
25-
startDestination = "list"
26-
) {
27-
composable("list") {
28-
ListScreen(navController)
26+
NavHost(navController = navController, startDestination = ListDestination) {
27+
composable<ListDestination> {
28+
ListScreen(navigateToDetails = { objectId ->
29+
navController.navigate(DetailDestination(objectId))
30+
})
2931
}
30-
composable("detail/{objectId}") { backStackEntry ->
31-
val objectId = backStackEntry.arguments?.getString("objectId")?.toInt()
32-
DetailScreen(navController, objectId!!)
32+
composable<DetailDestination> { backStackEntry ->
33+
DetailScreen(
34+
objectId = backStackEntry.toRoute<DetailDestination>().objectId,
35+
navigateBack = {
36+
navController.popBackStack()
37+
}
38+
)
3339
}
3440
}
3541
}

composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/di/Koin.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
1212
import io.ktor.http.ContentType
1313
import io.ktor.serialization.kotlinx.json.json
1414
import kotlinx.serialization.json.Json
15-
import org.koin.compose.viewmodel.dsl.viewModel
1615
import org.koin.core.context.startKoin
1716
import org.koin.core.module.dsl.factoryOf
1817
import org.koin.dsl.module

composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/screens/detail/DetailScreen.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import androidx.compose.ui.text.buildAnnotatedString
3333
import androidx.compose.ui.text.font.FontWeight
3434
import androidx.compose.ui.text.withStyle
3535
import androidx.compose.ui.unit.dp
36-
import androidx.navigation.NavController
3736
import com.jetbrains.kmpapp.data.MuseumObject
3837
import com.jetbrains.kmpapp.screens.EmptyScreenContent
3938
import io.kamel.image.KamelImage
@@ -48,20 +47,24 @@ import kmp_app_template.composeapp.generated.resources.label_dimensions
4847
import kmp_app_template.composeapp.generated.resources.label_medium
4948
import kmp_app_template.composeapp.generated.resources.label_repository
5049
import kmp_app_template.composeapp.generated.resources.label_title
50+
import kotlinx.serialization.Serializable
5151
import org.jetbrains.compose.resources.stringResource
5252
import org.koin.compose.viewmodel.koinViewModel
5353

54+
@Serializable
55+
data class DetailDestination(val objectId: Int)
56+
5457
@Composable
5558
fun DetailScreen(
56-
navController: NavController,
5759
objectId: Int,
60+
navigateBack: () -> Unit,
5861
) {
5962
val viewModel = koinViewModel<DetailViewModel>()
6063

6164
val obj by viewModel.getObject(objectId).collectAsState(initial = null)
6265
AnimatedContent(obj != null) { objectAvailable ->
6366
if (objectAvailable) {
64-
ObjectDetails(obj!!, onBackClick = { navController.navigateUp() })
67+
ObjectDetails(obj!!, onBackClick = navigateBack)
6568
} else {
6669
EmptyScreenContent(Modifier.fillMaxSize())
6770
}

composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/screens/list/ListScreen.kt

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,19 @@ import androidx.compose.ui.graphics.Color
2828
import androidx.compose.ui.layout.ContentScale
2929
import androidx.compose.ui.text.font.FontWeight
3030
import androidx.compose.ui.unit.dp
31-
import androidx.navigation.NavController
3231
import com.jetbrains.kmpapp.data.MuseumObject
3332
import com.jetbrains.kmpapp.screens.EmptyScreenContent
3433
import io.kamel.image.KamelImage
3534
import io.kamel.image.asyncPainterResource
35+
import kotlinx.serialization.Serializable
3636
import org.koin.compose.viewmodel.koinViewModel
3737

38+
@Serializable
39+
object ListDestination
40+
3841
@Composable
3942
fun ListScreen(
40-
navController: NavController,
43+
navigateToDetails: (objectId: Int) -> Unit
4144
) {
4245
val viewModel = koinViewModel<ListViewModel>()
4346
val objects by viewModel.objects.collectAsState()
@@ -46,9 +49,7 @@ fun ListScreen(
4649
if (objectsAvailable) {
4750
ObjectGrid(
4851
objects = objects,
49-
onObjectClick = { objectId ->
50-
navController.navigate("detail/$objectId")
51-
}
52+
onObjectClick = navigateToDetails,
5253
)
5354
} else {
5455
EmptyScreenContent(Modifier.fillMaxSize())
@@ -68,7 +69,8 @@ private fun ObjectGrid(
6869
modifier = modifier
6970
.fillMaxSize()
7071
.padding(WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal).asPaddingValues()),
71-
contentPadding = WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical).asPaddingValues(),
72+
contentPadding = WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)
73+
.asPaddingValues(),
7274
) {
7375
items(objects, key = { it.objectID }) { obj ->
7476
ObjectFrame(
@@ -102,7 +104,10 @@ private fun ObjectFrame(
102104

103105
Spacer(Modifier.height(2.dp))
104106

105-
Text(obj.title, style = MaterialTheme.typography.subtitle1.copy(fontWeight = FontWeight.Bold))
107+
Text(
108+
obj.title,
109+
style = MaterialTheme.typography.subtitle1.copy(fontWeight = FontWeight.Bold)
110+
)
106111
Text(obj.artistDisplayName, style = MaterialTheme.typography.body2)
107112
Text(obj.objectDate, style = MaterialTheme.typography.caption)
108113
}

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[versions]
22
agp = "8.6.0"
33
androidx-activityCompose = "1.9.2"
4-
androidx-ui-tooling = "1.7.0"
4+
androidx-ui-tooling = "1.7.2"
55
compose-multiplatform = "1.6.11"
66
kamel = "0.9.5"
77
koin = "4.0.0"
88
kotlin = "2.0.20"
99
ktor = "2.3.12"
10-
navigationCompose = "2.7.0-alpha07"
10+
navigationCompose = "2.8.0-alpha10"
1111

1212
[libraries]
1313
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activityCompose" }

0 commit comments

Comments
 (0)