Jetpack Compose Navigation:直接导航到非 startDestination 的嵌套图中的路由

2024-05-27

我正在开发 Jetpack Compose Navigation 演示,并且有一个嵌套导航图,其中包含两个不同的嵌套路线以及每个嵌套路线的屏幕:

  • 登录图
  • 主图

登录图具有三种路线,用于显示三个不同的屏幕

  • 路由“登录”以显示登录屏幕
  • 路由“register”用于显示RegisterScreen
  • 路由“recoverPassword”用于显示 RecoverPasswordScreen

主图有两个用于这些屏幕的路线

  • 路由“home”以显示主屏幕
  • 路由“设置”以显示设置屏幕

嵌套图的创建被称为MainActivity.kt

setContent {
        NavigationDemoTheme {

            val navController = rememberNavController()
            SetupNavGraph(navController = navController)
        }
    }

文件中的函数嵌套导航图.kt看起来像这样:

fun SetupNavGraph(navController: NavHostController) {
    NavHost(navController = navController, startDestination = "login_route")
    {
        loginGraph(navController = navController)
        mainGraph(navController = navController)
    }
}

在文件中LoginNavGraph.kt我已经定义了路线和出发目的地

fun NavGraphBuilder.loginGraph(navController: NavController) {
    navigation(startDestination = "login", route = "login_route") {
        composable(route = "login") {
            LoginScreen(navController = navController)
        }

        composable(route = "register") {
            RegisterScreen(navController = navController)
        }

        composable(route = "recover") {
            RecoverPasswordScreen(navController = navController)
        }
    }
}

在文件中MainNavGraph.kt我已经定义了这两条路线和这个起始目的地:

 navigation(startDestination = "home", route = "main_route") {

        composable(route = "home") { 
            HomeScreen(navController = navController)
        }

        composable(route = "settings") { 
            SettingsScreen(navController = navController)
        }
    }

我现在的问题是:如何从设置屏幕显示恢复密码屏幕。我知道我可以从 SettingsScreen 导航到“login_route”,但随后将显示 startDestination,即 LoginScreen。

// shows the LoginScreen because the startDestination in the "login_route" is set to "login"
navController.navigate(route = "login_route")
   

那么,如何直接导航到嵌套图路由“login_route”中的路由“recover”?我想到了以下“解决方法”:

将参数传递给“login_route”,例如:

navController.navigate(route = "login_route?destination=recover")

然后,我将只有一条路线作为目的地,例如“LoginView”。这将改变登录图,如下所示:

fun NavGraphBuilder.loginGraph(navController: NavController) {

    navigation(startDestination = "login_view, route = "login_route/{destination}) {

        composable(
            route = "login_view",
            arguments = listOf(
                navArgument("destination") { defaultValue = "login" },
            )
        ) { backStackEntry ->

            val destination =  backStackEntry.arguments?.getString("destination");

            destination?.let { destination ->  
                LoginView(destination = destination)
            }
        }
    }
}

LoginView 是可组合的,它将有一个自己的 NavHost,我可以在其中使用上一个路由中的查询参数设置 startDestination:

fun LoginView( destination : String = "login"){

    val navController = rememberNavController()
    var startDestination = destination;

    Scaffold ()
    {

        NavHost(
            navController = navController,
            startDestination = startDestination
        ) {

           composable(route = "login") {
             LoginScreen(navController = navController)
           }

           composable(route = "register") {
             RegisterScreen(navController = navController)
           }

           composable(route = "recover") {
             RecoverPasswordScreen(navController = navController) 
           }
    }
}

现在我应该能够从设置屏幕调用 RecoverPasswordScreen:

navController.navigate(route = "login_route?destination=recover")

另一种可能性是在定义的 MainGraph 中为 RecoverPassword Screen 提供额外的路由。是否有其他可能性可以直接访问嵌套图中的路线?如果可以在路由到“login_route”时动态更改 startDestination 那就太好了,但我不知道如何或是否可能这样做。


一种可能的解决方案是使用导航图中定义的深层链接 - 它们也适用于嵌套目的地。然后,您可以使用navController.navigate(deepLinkUri)

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

Jetpack Compose Navigation:直接导航到非 startDestination 的嵌套图中的路由 的相关文章

  • StrictMode 策略违规:我的应用程序中存在 android.os.strictmode.LeakedClosableViolation?

    Android 开发新手 第一次在我的应用程序上尝试 StrictMode 我注意到以下内容 并想知道这是否是我的应用程序或库中的问题 我不太清楚 谢谢你 D StrictMode StrictMode policy violation a
  • 卸载后 Web 应用程序不显示“添加到主屏幕”

    这是我第一次创建网络应用程序 我设法解决了这个问题 所以我得到了实际的 chrome 提示 将其添加到主屏幕 然后我从手机上卸载了该网络应用程序 因为我想将其展示给我的同事 但是 屏幕上不再出现提示 问题 这是有意为之的行为还是我的应用程序
  • 如何以编程方式检查 AndroidManifest.xml 中是否声明了服务?

    我正在编写一个库 该库提供了一项服务 其他开发人员可以通过将其包含在他们的项目中来使用该服务 因此 我无法控制 AndroidManifest xml 我在文档中解释了要做什么 但一个常见的问题是人们忽略了将适当的 标记添加到其清单中 或者
  • android xamarin 中的 reCaptcha

    我想在 Xamarin android 应用程序中实现验证码 我抓住了这个在 Android 中集成 googles reCaptcha 验证 https www c sharpcorner com article how to integ
  • 找不到处理意图 com.instagram.share.ADD_TO_STORY 的活动

    在我们的 React Native 应用程序中 我们试图让用户根据视图 组件中的选择直接将特定图像共享到提要或故事 当我们尝试直接使用 com instagram share ADD TO FEED 进行共享时 它以一致的方式完美运行 但是
  • 是否必须删除 Intent extra?

    这可能是一个愚蠢的问题 但是是否有一条规则规定消费活动必须显式删除 Intent 额外内容 或者只有在回收 Intent 对象时才如此 换句话说 如果我总是通过执行以下操作来链接到下一个活动 Intent i new Intent MyCu
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 在gradle插件中获取应用程序变体的包名称

    我正在构建一个 gradle 插件 为每个应用程序变体添加一个新任务 此新任务需要应用程序变体的包名称 这是我当前的代码 它停止使用最新版本的 android gradle 插件 private String getPackageName
  • 你的CPU不支持NX

    我刚刚下载了 android studio 但是我遇到了一个问题 当我运行它时 它说你的 cpu 不支持 NX 我应该怎么办 NX 或实际上是 NX 处理器位 是处理器的一项功能 有助于保护您的 PC 免受恶意软件的攻击 当此功能未启用并且
  • 如何发布Android .aar源以使Android Studio自动找到它们?

    我正在将库发布到内部 Sonatype Nexus 存储库 Android Studio 有一个功能 可以自动查找通过 gradle 引用的库的正确源 我将 aar 的源代码作为单独的 jar 发布到 Nexus 但 Android Stu
  • 如何使用InputConnectionWrapper?

    我有一个EditText 现在我想获取用户对此所做的所有更改EditText并在手动将它们插入之前使用它们EditText 我不希望用户直接更改中的文本EditText 这只能由我的代码完成 例如通过使用replace or setText
  • 如何默认在 ActionOpenDocument 意图中显示“内部存储”选项

    我需要用户选择一个自定义文件类型的文件 并将其从 Windows 文件资源管理器拖到 Android 设备上 但默认情况下内部存储选项不可用 当我使用以下命令启动意图时 var libraryIntent new Intent Intent
  • Android Studio 0.4.3 Eclipse项目没有gradle

    在此版本之前 在 Android Studio 中按原样打开 Eclipse 项目似乎很容易 无需任何转换 我更喜欢 Android Studio 环境 但我正在开发一个使用 eclipse 作为主要 IDE 的项目 我不想只为这个项目下载
  • 我的设备突然没有显示在“Android 设备选择器”中

    我正在使用我的三星 Galaxy3 设备来测试过去两个月的应用程序 它运行良好 但从今天早上开始 当我将设备连接到系统时 它突然没有显示在 Android 设备选择器 窗口中 我检查过 USB 调试模式仅在我的设备中处于选中状态 谁能猜出问
  • Android向menuItem添加子菜单,addSubMenu()在哪里?

    我想根据我的参数以编程方式将 OptionsMenu 内的子菜单添加到 menuItem 中 我检查了android sdk中的 MenuItem 没有addSubMenu 方法 尽管你可以找到 hasSubMenu 和 getSubMen
  • Android:膨胀布局时出现 StackOverFlowError 和 InvokingTargetException

    首先 对不起我的英语 我在膨胀布局时有一个问题 我有一个自定义视图 从 LinearLayout 扩展而来 称为按钮帮助 我在名为的布局上使用该视图加载活动 我的以下代码在所有设备和模拟器上都能完美运行 但具有 QVGA 屏幕 例如 Sam
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将 Intent 包装在 LabeledIntent 中以用于显示目的

    要求 我的应用程序中有一个 共享 按钮 我需要通过 Facebook 分享 我需要选择是否安装原生 Facebook 应用程序 我们的决定是 如果未安装该应用程序 则将用户发送到 facebook com 进行分享 当前状态 我可以检测何时
  • 将两个文本视图并排放置在布局中

    我有两个文本视图 需要在布局中并排放置 并且必须遵守两条规则 Textview2 始终需要完整显示 如果布局中没有足够的空间 则必须裁剪 Textview1 例子 文本视图1 文本视图2 Teeeeeeeeeeeeeeeeeextview1
  • Crashlytics 出现 Android Studio 构建错误

    我正在尝试将 CrashLytics 与 Android Studio 和 gradle 一起使用 但出现一个令人困惑的错误 java lang NoSuchMethodError 我的 build gradle 是 buildscript

随机推荐

  • 如何获取subprocess.run启动的进程的pid并杀死它

    我使用的是 Windows 10 和 Python 3 7 我运行了以下命令 import subprocess exeFilePath C Users test test exe subprocess run exeFilePath 使用
  • 计算 TCP 重传次数

    我想知道在LINUX中是否有一种方法可以计算一个流中发生的TCP重传的次数 无论是在客户端还是服务器端 好像netstat s解决了我的目的
  • 源生成器:有关引用项目的信息?

    我开始使用 C 源生成器 我想要的是开始一个git describe tags long处理并填充静态GitVersion具有当前标签和哈希码作为属性的类 问题是 我没有关于引用项目的目录的信息 所以我不知道在哪里运行 git 进程 我在其
  • 连接查询或子查询

    开发人员何时使用联接而不是子查询是否有经验规则 或者它们是否相同 第一个原则是 准确地陈述查询 第二个原则是 简单明了地陈述查询 这是你通常做出选择的地方 第三个是 陈述查询 以便它能够有效地处理 如果它是一个具有良好查询处理器的数据库管理
  • Base 64 编码的有效字符范围

    我对以下内容感兴趣 是否有一个字符列表never作为 Base 64 编码字符串的一部分出现 例如 我不确定这种情况是否会发生 如果原始输入实际上有 作为它的一部分 编码会有所不同吗 这是我可以发现的 RFC 4648 http www r
  • 从函数参数构建模板?

    template
  • 通过 VPN 容器路由 Docker 容器流量

    我在我的上安装了几个容器洛克Pro64 运行 openmediavault 的 ARMv8 处理器 rev 2 v8 版本 4 1 27 1 Arrakis 一切都运转良好 我使用的容器包括 Transmission Jellyfin Ra
  • IntelliSense:对象具有与成员函数不兼容的类型限定符

    我有一个名为 Person 的类 class Person string name long score public Person string name long score 0 void setName string name voi
  • ECS 上蓝/绿部署所需的 Cloudformation 脚本

    我正在尝试编写一个云形成模板具有蓝绿部署支持的 AWS ECS 这项蓝绿功能最近由 AWS 在 ECS 中添加 但在云形成模板中找不到任何更新它的参考 他们提供了有关如何通过 UI 而不是通过云形成来完成此操作的文档 我猜想 AWS 可能不
  • 集到子集点云匹配

    我有两个 3d 坐标的点云 一个是另一个的子集 包含更少的点 它们的规模相同 我需要做的是找到两者之间的平移和旋转 我看过点云库 迭代最近点 https en wikipedia org wiki Iterative closest poi
  • 如何防止 Firefox 缓存

    我尝试了很多可能的解决方案 但无法解决问题 这些不起作用 有人可以帮忙吗 我正在使用jsp servlet application 是websphere Portal 6 1 的一个portlet 切勿
  • 在跨平台的 npm 脚本中使用环境变量

    我正在构建一个 package json 并使用 npm run 来运行一些脚本 确切地说 https docs npmjs com misc scripts https docs npmjs com misc scripts 我的脚本需要
  • Kotlin 无法编译库

    There s this http github com theapache64 BugMailer我创建的库是为了通过电子邮件报告异常情况 它适用于 Android Java 项目 但不适用于 Android Kotlin 当我添加库的编
  • 如何对URL进行分类? URL 的特点是什么?如何从 URL 中选择和提取特征

    我刚刚开始研究分类问题 这是一个两类问题 我的训练模型 机器学习 必须决定 预测是允许 URL 还是阻止它 我的问题非常具体 如何对 URL 进行分类 我应该使用普通的文本分析方法吗 URL 的特点是什么 如何从URL中选择和提取特征 我假
  • 使用事件实现观察者模式

    我正在开发一个 Silverlight 应用程序 其中过度使用了观察者模式 在我的实现中 我创建了两个接口IObservable
  • 为什么某些 float < integer 比较比其他比较慢四倍?

    将浮点数与整数进行比较时 某些值对的计算时间比类似大小的其他值要长得多 例如 gt gt gt import timeit gt gt gt timeit timeit 562949953420000 7 lt 56294995342100
  • 算法 - 树中所有节点的最大距离

    所以 找到树中两个节点之间的最长路径相当容易 但我想要的是找到从节点出发的最长路径x到树中的另一个节点 对于所有x 这个问题也可以用以下方式表达 计算从给定的树中可以生成的所有有根树的高度 One way of course is to j
  • 如何使 WPF 中的窗口对鼠标事件不可见?

    我创建了这个类 它非常适合使我的 WPF 应用程序对鼠标事件透明 using System Runtime InteropServices class Win32 public const int WS EX TRANSPARENT 0x0
  • 从基本控制器继承 LINQ-to-SQL 数据上下文

    我的基本控制器类 BaseController 由面向公众的控制器继承 用于使用 LINQ to SQL 访问请求之间的共享数据上下文 我是否可以通过将数据存储在中来以高效且安全的方式访问我的数据上下文HttpContext Current
  • Jetpack Compose Navigation:直接导航到非 startDestination 的嵌套图中的路由

    我正在开发 Jetpack Compose Navigation 演示 并且有一个嵌套导航图 其中包含两个不同的嵌套路线以及每个嵌套路线的屏幕 登录图 主图 登录图具有三种路线 用于显示三个不同的屏幕 路由 登录 以显示登录屏幕 路由 re