Jetpack Compose:嵌套导航,在嵌套路径中使用底部栏导航

2024-05-06

我的应用程序具有以下结构,并且由于路线 B ​​有自己的底部导航栏,因此有自己的 NavHost,我如何从屏幕 C(从选项卡栏打开)导航到路线 A?

 - Nested Route "/onboarding_route", startDestination = 'start' 
     - route 'start' -> Screen 'Login' (Composable)
     - route 'legal' -> Screen 'Legal' (Composable)

- Nested Route "/login_route", startDestination = 'login' 
     - route 'login' -> Screen 'Login' (Composable)
     - route 'register' -> Screen 'Register' (composable)
     - route 'recover' -> Screen 'Recover' (composable)

- Nested Route '/main_app', startDestination 'dashboard' => with bottom navigation
     - route 'dashboard' -> Screen 'Dashboard' (composable)
     - route 'product' -> Screen 'Product' (composable)
     - route 'profile' -> Screen 'Profile'
     

导航到路线“main_app”应显示带有三个导航项的底部导航栏。我可以使用每个屏幕(仪表板、产品、配置文件)中带有底部栏的脚手架来完成此操作,或者我可以在顶部添加一个 MainView 屏幕,该屏幕固定带有底部栏的脚手架:

 - Nested Route '/main_app', startDestination 'mainVie/dashboard' => with bottom navigation
     - route 'mainView/{tabname} => Screen 'MainView' with Scaffold & bottom bar
          - route 'dashboard' -> Screen 'Dashboard' (composable)
          - route 'product' -> Screen 'Product' (composable)
          - route 'profile' -> Screen 'Profile'

如果我使用此解决方案,则会遇到以下问题:在“仪表板”、“产品”和“配置文件”屏幕中,我只有底部栏中的导航控制器,并且无法导航到“login_route”等顶级路线。

我认为这是很常见的场景:你有一个入门屏幕、登录/注册屏幕,而且它们都没有底部栏。进入主屏幕后,您希望显示底部栏,然后您可能希望从其中一个屏幕返回登录屏幕。如果整个导航被分隔在嵌套导航路线中(正如谷歌建议的那样),我不知道如何从嵌套屏幕导航回最上面的路线之一。

拥有正确且简洁的导航结构的最佳实践是什么?


首先,你有 mainActivity 和这个 navGraph :

AnimatedNavHost(
    navController = navController,
    startDestination = "onBoarding",
    modifier = modifier
) {
  onBoardingScreen(
   navigateToLegal = {
    navController.navigateToLegal()
   }
   nestedGraphs = {
      legalScreen()
   }
  )
  loginScreen(
   nestedGraphs = {
      registerScreen()
      recoverScreen()
   }
  )
  mainScreen(
   nestedGraphs = {
      productScreen()
      profileScreen()
   }
  )
}

然后在每个屏幕中你可以有这样的东西:

fun NavGraphBuilder.onBoardingScreen(
    nestedGraphs: NavGraphBuilder.() -> Unit,
    navigateToLegal : () -> Unit
) {
   navigation(
       route = "onBoardingGraphRoutePattern",
       startDestination ="start"
   ) {
       composable(
           route ="start",
       ) {
        StartRoute()
       }
       nestedGraphs()
    }
}

对于每个嵌套屏幕,我们有两个这样的函数:

1-

fun NavController.navigateToLegal(
   navOptions: NavOptions? = null
) {
   this.navigate("legal", navOptions)
}

2-

fun NavGraphBuilder.legalScreen() {
  composable(
      route = "legal",
  ) {
      LegalRoute()
  }
}

我认为通过这种模式,您可以在每个屏幕的主导航和嵌套导航图中拥有一个导航控制器,并且可以处理您的应用程序

有关更多信息和更多示例,您可以阅读此项目:现在在安卓系统中 https://github.com/android/nowinandroid

希望对你有帮助:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetpack Compose:嵌套导航,在嵌套路径中使用底部栏导航 的相关文章

随机推荐

  • 看起来像 iOS7 向左导航 V 形的 Unicode 字符

    最接近 iOS7 向后指向导航栏 V 形的大小 与大写字母一样大或大于大写字母 和形状的 Unicode 字符是什么 我正在寻找一种使用 unicode 字符来模拟通常没有 返回 导航的视图的 向后导航 V 形的方法 常规的 对于锐角比 U
  • 黑白 PNG 转 SVG

    我有一个河流 土地掩码来区分土地与河流 湖泊 该文件的大小为 W 43 200x H 21 600 由于 RAM 立即填满 因此无法打开该文件 我已将文件分成 3600 3600 块 它们可以正常打开 然而 我试图在谷歌地图中绘制陆地上的文
  • 关于 GUI 计时器显示后台线程已用时间的建议?

    Issue 我有一个 PyQt GUI 用户按下按钮即可启动后台线程 workerThread 它是从QThread 我想要一个计时器显示 以QLabel 显示自此以来已经过去了多少时间workerThread开始 我希望这个计时器在wor
  • s60 的 python 希伯来语字符串

    我在 S60 上使用 python 我想使用希伯来语字符串 在 GUI 上表示它们并以短信形式发送它们 看来 PythonScriptShell 不接受这样的表达式 例如 u 我能做些什么 谢谢 事态发展 我添加了这一行 coding ut
  • 如何在 Google Chrome 上启用 WebVR?

    我正在尝试创建一个 WebVR 场景 对于此任务 我想在 Google Chrome 上启用 WebVR 我的操作系统是 Windows 8 我使用打开标志chrome flags WebVR 不存在 我怎样才能启用它 Official c
  • HttpClient 请求拦截器,例如在从服务器获取响应时

    我想在请求尝试命中时打开加载程序弹出窗口 并在收到响应后将其关闭 有什么方法可以使用 httpclient 从一个地方执行它 像这样的事情 Injectable export class I1 implements HttpIntercep
  • 如果 showPopup 仅适用于 API 11,如何将菜单链接到带有 ABS 的视图?

    注意 PopupMenu 在 API 级别 11 及更高版本中可用 http developer android com guide topics ui menus html PopupMenu http developer android
  • 使用 AngularJS 获取 Youtube 视频标题

    我在使用 AngularJS 获取 YouTube 视频标题时遇到问题 这是我到目前为止的代码 服务 js var myServices angular module myServices ngResource myServices fac
  • 如何启动 EC2 实例并在每个实例上上传/运行启动脚本?

    我想自动启动一组 Linux EC2 实例 基本上 我想编写一个脚本 程序 实例化我的给定 AMI 的 N 次出现 对于每个启动的实例 它会上传自定义脚本并让脚本运行到实例中 使用 VMWare 我通常会使用vmrun或 Vix SDK 亚
  • pygame.sprite.Group() 做什么

    我正在关注有关 pygame 的视频 我看到了这段代码 crosshair pygame sprite Group 有人能给我解释一下吗 阅读以下文档pygame sprite Group https www pygame org docs
  • Excel VBA application.visible 立即设置回 True

    我已经设置了一个新的 空的 无模式的用户表单 用最少的代码来解决我的问题 当工作簿打开时 执行以下代码来隐藏 Excel 并显示用户窗体 这是工作簿的唯一代码 Private Sub Workbook Open UserForm1 Show
  • parse_str 在元素前面加上 & 符号?

    我一直在玩 cURL 并尝试将数组作为 POST 变量发送 我决定使用 http build query 按预期传递字符串 curl setopt this gt ch CURLOPT POSTFIELDS http build query
  • 如何计算PHP中内置函数的总数? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 如何计算
  • 如何从 .Net 中的许多 HTML 文件中读取 xpath 值?

    我的一个文件夹中有大约 5000 个 html 文件 我需要循环遍历它们 打开 使用 xpath 获取 10 个值 关闭并存储在 SQL Server 数据库中 使用 Net 读取 xpath 值的最简单方法是什么 xpath 应该相当稳定
  • 如何通过内存将文件上传到Google Drive [python]

    我一直在论坛上搜索 但没有成功解决我的问题 我正在尝试使用 Google Drive Python API 将内存中的文件上传到 Google Drive 但是 我见过的所有示例都使用磁盘上具有特定文件路径和名称的文件 service bu
  • 在 Ada 中定义通用标量类型包

    我想通过制作一个用于操作多项式的 Ada 包来测试编写 Ada 包的水 可以为多种代数结构定义多项式 因此为了反映这一点 我想使该包通用 以便它可以与浮点数 整数或其他数字子类型一起使用 我现在想说 我对 Ada 的类型系统如何工作或者它的
  • 如何设置 Xcode 来代替 Qt Creator 工作?

    我不使用 Qt Creator 的 UI 设计功能 对于一个新项目 我想体验一下使用 Xcode 的工作 这将是一个常规的 Qt 项目 使用 C 和 Qt 库开发 就像在 Qt Creator 中一样 我没有使用 OS X 尤其是 Xcod
  • 使用 PHP 的 JavaScript atob 操作

    我想知道是否可以使用 PHP 解密 JavaScript 加密文本 使用 JavaScript 的 btoa 函数加密 看一下base64 decode http php net manual en function base64 deco
  • XML声明编码

    它实际上有什么作用 根据我的基本理解 XML 只是一种格式化文本 所以不涉及二进制文本转换 我高度怀疑 UTF 8 和 ASCII 编码之间的唯一区别是 ASCII 编码会将所有非 ASCII 字符转换为 XML 实体 而不是仅保留 XML
  • Jetpack Compose:嵌套导航,在嵌套路径中使用底部栏导航

    我的应用程序具有以下结构 并且由于路线 B 有自己的底部导航栏 因此有自己的 NavHost 我如何从屏幕 C 从选项卡栏打开 导航到路线 A Nested Route onboarding route startDestination s