关于compose中的navigation

关于compose中navigation的基本使用,可以参考

https://medium.com/@KaushalVasava/navigation-in-jetpack-compose-full-guide-beginner-to-advanced-950c1133740

包含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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值