Skip to content

Commit a212018

Browse files
authored
Merge pull request #26 from Kotlin/typed-navigation
Use Compose typed navigation
2 parents 013fba6 + 8b1aa9a commit a212018

File tree

5 files changed

+32
-22
lines changed

5 files changed

+32
-22
lines changed

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

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,16 @@ 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
1314
import com.jetbrains.kmpapp.screens.detail.DetailScreen
1415
import com.jetbrains.kmpapp.screens.list.ListScreen
16+
import kotlinx.serialization.Serializable
17+
18+
@Serializable
19+
object ListDestination
20+
21+
@Serializable
22+
data class DetailDestination(val objectId: Int)
1523

1624
@Composable
1725
fun App() {
@@ -20,16 +28,19 @@ fun App() {
2028
) {
2129
Surface {
2230
val navController: NavHostController = rememberNavController()
23-
NavHost(
24-
navController,
25-
startDestination = "list"
26-
) {
27-
composable("list") {
28-
ListScreen(navController)
31+
NavHost(navController = navController, startDestination = ListDestination) {
32+
composable<ListDestination> {
33+
ListScreen(navigateToDetails = { objectId ->
34+
navController.navigate(DetailDestination(objectId))
35+
})
2936
}
30-
composable("detail/{objectId}") { backStackEntry ->
31-
val objectId = backStackEntry.arguments?.getString("objectId")?.toInt()
32-
DetailScreen(navController, objectId!!)
37+
composable<DetailDestination> { backStackEntry ->
38+
DetailScreen(
39+
objectId = backStackEntry.toRoute<DetailDestination>().objectId,
40+
navigateBack = {
41+
navController.popBackStack()
42+
}
43+
)
3344
}
3445
}
3546
}

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: 2 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
@@ -53,15 +52,15 @@ import org.koin.compose.viewmodel.koinViewModel
5352

5453
@Composable
5554
fun DetailScreen(
56-
navController: NavController,
5755
objectId: Int,
56+
navigateBack: () -> Unit,
5857
) {
5958
val viewModel = koinViewModel<DetailViewModel>()
6059

6160
val obj by viewModel.getObject(objectId).collectAsState(initial = null)
6261
AnimatedContent(obj != null) { objectAvailable ->
6362
if (objectAvailable) {
64-
ObjectDetails(obj!!, onBackClick = { navController.navigateUp() })
63+
ObjectDetails(obj!!, onBackClick = navigateBack)
6564
} else {
6665
EmptyScreenContent(Modifier.fillMaxSize())
6766
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ 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
@@ -37,7 +36,7 @@ import org.koin.compose.viewmodel.koinViewModel
3736

3837
@Composable
3938
fun ListScreen(
40-
navController: NavController,
39+
navigateToDetails: (objectId: Int) -> Unit
4140
) {
4241
val viewModel = koinViewModel<ListViewModel>()
4342
val objects by viewModel.objects.collectAsState()
@@ -46,9 +45,7 @@ fun ListScreen(
4645
if (objectsAvailable) {
4746
ObjectGrid(
4847
objects = objects,
49-
onObjectClick = { objectId ->
50-
navController.navigate("detail/$objectId")
51-
}
48+
onObjectClick = navigateToDetails,
5249
)
5350
} else {
5451
EmptyScreenContent(Modifier.fillMaxSize())
@@ -68,7 +65,8 @@ private fun ObjectGrid(
6865
modifier = modifier
6966
.fillMaxSize()
7067
.padding(WindowInsets.safeDrawing.only(WindowInsetsSides.Horizontal).asPaddingValues()),
71-
contentPadding = WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical).asPaddingValues(),
68+
contentPadding = WindowInsets.safeDrawing.only(WindowInsetsSides.Vertical)
69+
.asPaddingValues(),
7270
) {
7371
items(objects, key = { it.objectID }) { obj ->
7472
ObjectFrame(
@@ -102,7 +100,10 @@ private fun ObjectFrame(
102100

103101
Spacer(Modifier.height(2.dp))
104102

105-
Text(obj.title, style = MaterialTheme.typography.subtitle1.copy(fontWeight = FontWeight.Bold))
103+
Text(
104+
obj.title,
105+
style = MaterialTheme.typography.subtitle1.copy(fontWeight = FontWeight.Bold)
106+
)
106107
Text(obj.artistDisplayName, style = MaterialTheme.typography.body2)
107108
Text(obj.objectDate, style = MaterialTheme.typography.caption)
108109
}

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)