Skip to content

Commit c93da3d

Browse files
authored
Migrate to navigation3 (#45)
* Migrate to navigation3 * Use assisted injection * Clean up
1 parent 8866849 commit c93da3d

19 files changed

Lines changed: 265 additions & 578 deletions

File tree

app/src/main/kotlin/com/skydoves/pokedex/compose/MainActivity.kt

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,32 +20,20 @@ import android.os.Bundle
2020
import androidx.activity.ComponentActivity
2121
import androidx.activity.compose.setContent
2222
import androidx.activity.enableEdgeToEdge
23-
import androidx.compose.runtime.CompositionLocalProvider
2423
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
25-
import com.skydoves.pokedex.compose.core.navigation.AppComposeNavigator
26-
import com.skydoves.pokedex.compose.core.navigation.LocalComposeNavigator
27-
import com.skydoves.pokedex.compose.core.navigation.PokedexScreen
2824
import com.skydoves.pokedex.compose.ui.PokedexMain
2925
import dagger.hilt.android.AndroidEntryPoint
30-
import javax.inject.Inject
3126

3227
@AndroidEntryPoint
3328
class MainActivity : ComponentActivity() {
3429

35-
@Inject
36-
internal lateinit var composeNavigator: AppComposeNavigator<PokedexScreen>
37-
3830
override fun onCreate(savedInstanceState: Bundle?) {
3931
installSplashScreen()
4032
enableEdgeToEdge()
4133
super.onCreate(savedInstanceState)
4234

4335
setContent {
44-
CompositionLocalProvider(
45-
LocalComposeNavigator provides composeNavigator,
46-
) {
47-
PokedexMain(composeNavigator = composeNavigator)
48-
}
36+
PokedexMain()
4937
}
5038
}
5139
}

app/src/main/kotlin/com/skydoves/pokedex/compose/navigation/PokedexNavHost.kt

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,56 @@
1616

1717
package com.skydoves.pokedex.compose.navigation
1818

19+
import androidx.compose.animation.ExperimentalSharedTransitionApi
1920
import androidx.compose.animation.SharedTransitionLayout
2021
import androidx.compose.runtime.Composable
21-
import androidx.navigation.NavHostController
22-
import androidx.navigation.compose.NavHost
22+
import androidx.compose.runtime.CompositionLocalProvider
23+
import androidx.compose.runtime.remember
24+
import androidx.navigation3.runtime.NavKey
25+
import androidx.navigation3.runtime.entryProvider
26+
import androidx.navigation3.runtime.rememberNavBackStack
27+
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
28+
import androidx.navigation3.ui.LocalNavAnimatedContentScope
29+
import androidx.navigation3.ui.NavDisplay
2330
import com.skydoves.compose.stability.runtime.TraceRecomposition
31+
import com.skydoves.pokedex.compose.core.navigation.LocalComposeNavigator
32+
import com.skydoves.pokedex.compose.core.navigation.PokedexNavigatorImpl
2433
import com.skydoves.pokedex.compose.core.navigation.PokedexScreen
34+
import com.skydoves.pokedex.compose.feature.details.PokedexDetails
35+
import com.skydoves.pokedex.compose.feature.home.PokedexHome
2536

37+
@OptIn(ExperimentalSharedTransitionApi::class)
2638
@Composable
2739
@TraceRecomposition
28-
fun PokedexNavHost(navHostController: NavHostController) {
29-
SharedTransitionLayout {
30-
NavHost(
31-
navController = navHostController,
32-
startDestination = PokedexScreen.Home,
33-
) {
34-
pokedexNavigation()
40+
fun PokedexNavHost() {
41+
val backStack = rememberNavBackStack(PokedexScreen.Home)
42+
val navigator = remember(backStack) { PokedexNavigatorImpl(backStack) }
43+
44+
CompositionLocalProvider(
45+
LocalComposeNavigator provides navigator,
46+
) {
47+
SharedTransitionLayout {
48+
NavDisplay(
49+
backStack = backStack,
50+
onBack = { backStack.removeLastOrNull() },
51+
entryDecorators = listOf(rememberSaveableStateHolderNavEntryDecorator()),
52+
entryProvider = entryProvider<NavKey> {
53+
entry<PokedexScreen.Home> {
54+
PokedexHome(
55+
sharedTransitionScope = this@SharedTransitionLayout,
56+
animatedContentScope = LocalNavAnimatedContentScope.current,
57+
)
58+
}
59+
60+
entry<PokedexScreen.Details> { screen ->
61+
PokedexDetails(
62+
sharedTransitionScope = this@SharedTransitionLayout,
63+
animatedContentScope = LocalNavAnimatedContentScope.current,
64+
pokemon = screen.pokemon,
65+
)
66+
}
67+
},
68+
)
3569
}
3670
}
3771
}

app/src/main/kotlin/com/skydoves/pokedex/compose/navigation/PokedexNavigation.kt

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

app/src/main/kotlin/com/skydoves/pokedex/compose/ui/PokedexMain.kt

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,14 @@
1717
package com.skydoves.pokedex.compose.ui
1818

1919
import androidx.compose.runtime.Composable
20-
import androidx.compose.runtime.LaunchedEffect
21-
import androidx.navigation.compose.rememberNavController
2220
import com.skydoves.compose.stability.runtime.TraceRecomposition
2321
import com.skydoves.pokedex.compose.core.designsystem.theme.PokedexTheme
24-
import com.skydoves.pokedex.compose.core.navigation.AppComposeNavigator
25-
import com.skydoves.pokedex.compose.core.navigation.PokedexScreen
2622
import com.skydoves.pokedex.compose.navigation.PokedexNavHost
2723

2824
@Composable
2925
@TraceRecomposition
30-
fun PokedexMain(composeNavigator: AppComposeNavigator<PokedexScreen>) {
26+
fun PokedexMain() {
3127
PokedexTheme {
32-
val navHostController = rememberNavController()
33-
34-
LaunchedEffect(Unit) {
35-
composeNavigator.handleNavigationCommands(navHostController)
36-
}
37-
38-
PokedexNavHost(navHostController = navHostController)
28+
PokedexNavHost()
3929
}
4030
}

core/designsystem/src/main/kotlin/com/skydoves/pokedex/compose/core/designsystem/component/PokedexSharedElement.kt

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

core/navigation/build.gradle.kts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@ dependencies {
1616
implementation(libs.androidx.core)
1717
implementation(libs.kotlinx.coroutines.android)
1818

19-
api(libs.androidx.navigation.compose)
19+
// Navigation3
20+
api(libs.androidx.navigation3.runtime)
21+
api(libs.androidx.navigation3.ui)
2022

2123
// json parsing
2224
implementation(libs.kotlinx.serialization.json)

core/navigation/src/main/kotlin/com/skydoves/pokedex/compose/core/navigation/LocalComposeNavigator.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,18 @@ import androidx.compose.runtime.ProvidableCompositionLocal
2121
import androidx.compose.runtime.ReadOnlyComposable
2222
import androidx.compose.runtime.compositionLocalOf
2323

24-
public val LocalComposeNavigator: ProvidableCompositionLocal<AppComposeNavigator<PokedexScreen>> =
24+
public val LocalComposeNavigator: ProvidableCompositionLocal<PokedexNavigator> =
2525
compositionLocalOf {
2626
error(
27-
"No AppComposeNavigator provided! " +
27+
"No PokedexNavigator provided! " +
2828
"Make sure to wrap all usages of Pokedex components in PokedexTheme.",
2929
)
3030
}
3131

3232
/**
33-
* Retrieves the current [AppComposeNavigator] at the call site's position in the hierarchy.
33+
* Retrieves the current [PokedexNavigator] at the call site's position in the hierarchy.
3434
*/
35-
public val currentComposeNavigator: AppComposeNavigator<PokedexScreen>
35+
public val currentComposeNavigator: PokedexNavigator
3636
@Composable
3737
@ReadOnlyComposable
3838
get() = LocalComposeNavigator.current

core/navigation/src/main/kotlin/com/skydoves/pokedex/compose/core/navigation/NavigationAnimation.kt

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

core/navigation/src/main/kotlin/com/skydoves/pokedex/compose/core/navigation/NavigationCommand.kt

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

core/navigation/src/main/kotlin/com/skydoves/pokedex/compose/core/navigation/NavigationModule.kt

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

0 commit comments

Comments
 (0)