Skip to content

Commit 700e666

Browse files
committed
Migrate to NavKey
The `Screen` sealed class now implements the `NavKey` interface from the navigation library and is marked as `@Serializable`. This change removes the manual `remember { mutableStateListOf<Screen>(PopularMovies) }` in favor of a new `rememberNavBackStack` composable function, which utilizes `rememberSerializable` with a `NavBackStackSerializer` for better state restoration.
1 parent 366d6c0 commit 700e666

File tree

2 files changed

+25
-8
lines changed

2 files changed

+25
-8
lines changed

app/src/main/java/io/github/lordraydenmk/themoviedbapp/MoviesApp.kt

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,44 @@
11
package io.github.lordraydenmk.themoviedbapp
22

33
import androidx.compose.runtime.Composable
4-
import androidx.compose.runtime.mutableStateListOf
5-
import androidx.compose.runtime.remember
6-
import androidx.compose.runtime.snapshots.SnapshotStateList
4+
import androidx.compose.runtime.saveable.rememberSerializable
75
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
6+
import androidx.navigation3.runtime.NavBackStack
87
import androidx.navigation3.runtime.NavEntry
8+
import androidx.navigation3.runtime.NavKey
99
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
10+
import androidx.navigation3.runtime.serialization.NavBackStackSerializer
11+
import androidx.navigation3.runtime.serialization.NavKeySerializer
1012
import androidx.navigation3.ui.NavDisplay
1113
import io.github.lordraydenmk.themoviedbapp.movies.Screen
1214
import io.github.lordraydenmk.themoviedbapp.movies.Screen.MovieDetails
1315
import io.github.lordraydenmk.themoviedbapp.movies.Screen.PopularMovies
1416
import io.github.lordraydenmk.themoviedbapp.movies.moviedetails.MovieDetailsNavScreen
1517
import io.github.lordraydenmk.themoviedbapp.movies.popularmovies.MoviesNavScreen
1618

17-
typealias BackStack = SnapshotStateList<Screen>
19+
typealias BackStack = NavBackStack<Screen>
1820

1921
@Composable
20-
fun MoviesApplication(appModule: AppModule) {
21-
val backStack = remember { mutableStateListOf<Screen>(PopularMovies) }
22+
fun <T : NavKey> rememberNavBackStack(vararg elements: NavKey): NavBackStack<T> {
23+
return rememberSerializable(
24+
serializer = NavBackStackSerializer(elementSerializer = NavKeySerializer())
25+
) {
26+
@Suppress("UNCHECKED_CAST")
27+
NavBackStack(*elements) as NavBackStack<T>
28+
}
29+
}
2230

31+
@Composable
32+
fun MoviesApplication(appModule: AppModule) {
33+
val backStack = rememberNavBackStack<Screen>(PopularMovies)
2334
NavDisplay(
2435
entryDecorators = listOf(
2536
rememberSaveableStateHolderNavEntryDecorator(),
2637
rememberViewModelStoreNavEntryDecorator()
2738
),
2839
backStack = backStack,
2940
onBack = { backStack.removeLastOrNull() },
30-
entryProvider = { key: Screen ->
41+
entryProvider = { key ->
3142
when (key) {
3243
PopularMovies -> NavEntry(key) {
3344
MoviesNavScreen(appModule, backStack)
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package io.github.lordraydenmk.themoviedbapp.movies
22

3+
import androidx.navigation3.runtime.NavKey
34
import io.github.lordraydenmk.themoviedbapp.movies.domain.MovieId
5+
import kotlinx.serialization.Serializable
46

5-
sealed class Screen {
7+
@Serializable
8+
sealed class Screen : NavKey {
9+
@Serializable
610
data object PopularMovies : Screen()
11+
12+
@Serializable
713
data class MovieDetails(val movieId: MovieId) : Screen()
814
}

0 commit comments

Comments
 (0)