A small and simple, yet fully fledged and customizable navigation library for Jetpack Compose:
- Full type-safety
- State restoration
- Nested navigation with independent backstacks
- Easy integration with BottomNavigation and TabRow
- Own lifecycle, saved state and view models for every backstack entry
- Animated transitions
- Navigation logic may be easily moved to the ViewModel layer
- No builders, no obligatory superclasses for your composables
Add a single dependency to your project:
implementation("dev.olshevski.navigation:reimagined:1.1.0")
Define a set of screens. It is convenient to use a sealed class for this:
sealed class Screen : Parcelable {
@Parcelize
object First : Screen()
@Parcelize
data class Second(val id: Int) : Screen()
@Parcelize
data class Third(val text: String) : Screen()
}
Create a composable with NavController
, NavBackHandler
and NavHost
:
@Composable
fun NavHostScreen() {
val navController = rememberNavController<Screen>(
startDestination = Screen.First
)
NavBackHandler(navController)
NavHost(navController) { screen ->
when (screen) {
Screen.First -> Column {
Text("First screen")
Button(onClick = {
navController.navigate(Screen.Second(id = 42))
}) {
Text("To Second screen")
}
}
is Screen.Second -> Column {
Text("Second screen: ${screen.id}")
Button(onClick = {
navController.navigate(Screen.Third(text = "Hello"))
}) {
Text("To Third screen")
}
}
is Screen.Third -> {
Text("Third screen: ${screen.text}")
}
}
}
}
As you can see, NavController
is used for switching between screens, NavBackHandler
handles back presses and NavHost
provides a composable corresponding to the last destination in the backstack. As simple as that.
Full documentation is available here.
Explore the sample. It demonstrates:
- nested navigation
- BottomNavigation
- NavHost/AnimatedNavHost usage
- passing values and returning results
- dialog navigation
- entry-scoped ViewModels
- usage of NavController within the ViewModel layer
- deeplinks
I've been thinking about Android app architecture and navigation in particular for the longest time. After being introduced to Compose I could finally create the navigation structure that satisfies all my needs perfectly.
I hope it can help you as well.
If you like this library and find it useful, please star the project and share it with your fellow developers. A little bit of promotion never hurts.