关于compose中navigation的基本使用,可以参考
包含navigation的使用,大部分我们是在会发送一些一次性的事件,然后在activity中通过事件来进行导航的切换。
然后最近在pl的视频中看到这个项目
https://github.com/philipplackner/NavigationFromViewModel
通过viewmode中发送事件,在activity中接收时间,并完成navigator的navigation。通过kotin注入navigator,这样减少在很多地方对navController的引用,也便于测试。
viewmodel 通过navigator的具体实现类来发送事件到channel,activity监听channel中的事件,调用navcontroller来进行导航。
在多模块中用导航的时候呢
Compose Navigation用于Android多module项目最佳实践_android compose navigation-CSDN博客
前后对比区别主要在于 NavGraphBuilder 的引入,封装导航代码
- 将导航代码封装为一组相关屏幕,方法是将其放置 放在单独的文件中
- 通过在
NavGraphBuilder
上创建扩展函数来公开目的地 - 通过在
NavController
上创建扩展函数来公开导航事件 - 使用
internal
确保屏幕和路由类型不会公开
//在专门的ArticleNavigation.kt 文件中
private const val articleIdArg = "articleId"
//通过扩展NavGraphBuilder函数来公开目的地
fun NavGraphBuilder.articleScreen(onNavigateBack: () -> Unit) {
composable("article/{$articleIdArg}") {
val viewModel: ArticleViewModel = hiltViewModel()
ArticleScreen(
viewModel = viewModel,
onNavigateBack = onNavigateBack
)
}
}
// NavController 上创建扩展函数来公开导航事件
fun NavController.navigateToArticle(articleId: String) {
this.navigate("article/$articleId")
}
//使用 internal 确保屏幕和路由类型不会公开
internal class ArticleArgs(articleId: String) {
constructor(savedStateHandle: SavedStateHandle) :
this(checkNotNull(savedStateHandle[articleIdArg]) as String)
}
模块的层级也进行组织,从一开始的APP引用所有模块,改为,app引用 home 和 article,
home 再引用articles,setting,about