Screen object support for navigation-compose
- Android Gradle Plugin 8.1.1 or later
- Jetpack Compose 1.5.0
- navigation-compose 2.7.1
- Kotlin 1.9.10
- minimum SDK version 23 (Android 6.0)
Provide type safe navigation to navigation-compose
// screenBaseClass is optional
@AutoScreenId(
"ExampleScreen",
screenBaseClass = MyScreen::class,
)
enum class ExampleScreenId {
// Deep Link support
@Route(
"/",
deepLinks = ["https://takuji31.jp/compose-navigation/"],
)
Home,
// arguments support
@Route(
"/blog/{blogId}",
stringArguments = [StringArgument("blogId")],
)
Blog,
// auto argument type is String
@Route("/blog/{blogId}/entry/{entryId}")
Entry,
// enum type arguments supported
@Route(
"/ranking/?rankingType={rankingType}",
enumArguments = [
EnumArgument(
"rankingType",
RankingType::class,
hasDefaultValue = true,
"daily",
),
],
)
Ranking,
@Route("/settings")
Settings,
}
You can use generated screen code in your code!
@Composable
fun Main(navController: ScreenNavController) { // val navController = rememberScreenNavController()
val currentScreen by navController.currentScreen.collectAsState()
ScreenNavHost(
navController = navController,
startScreen = ExampleScreen.Home,
) {
val onBottomSheetItemClicked: (ExampleScreen) -> Unit = { screen ->
navController.navigate(screen) {
popUpTo(ExampleScreenId.Home) { inclusive = screen == ExampleScreen.Home }
}
}
exampleScreenComposable {
home { screen ->
val viewModel = navViewModel<HomeViewModel>()
val state by viewModel.state.collectAsState()
Home(
state = state,
screen = screen,
onBottomSheetItemClicked = onBottomSheetItemClicked,
onReloadButtonClick = { viewModel.reload() },
onItemClick = { navController.navigate(ExampleScreen.Blog(it.id)) },
)
}
blog { screen ->
val viewModel = navViewModel<BlogViewModel>()
val state by viewModel.state.collectAsState()
Blog(
state = state,
screen = screen,
onReloadButtonClick = { viewModel.reload() },
onItemClick = {
navController.navigate(
ExampleScreen.Entry(
screen.blogId,
it.id,
),
)
},
)
}
// ...
}
}
}
Add JitPack to your repositories
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' } // or maven("https://jitpack.io") in Kotlin DSL
}
}
Apply kapt plugin
plugins {
id("com.android.library")
id("kotlin-kapt") // or kotlin("kapt") in Kotlin DSL
}
Add dependencies
dependencies {
implementation("com.github.takuji31.navigation-compose-screen:navigation-compose-screen:+")
kapt("com.github.takuji31.navigation-compose-screen:compiler:+")
}