当前位置: 首页 > 知识库问答 >
问题:

在Jetpack Compose中使用NavHostFragment

董胡非
2023-03-14

我们有一个遗留应用程序,我们开始迁移到Jetpack Compose。该应用程序只有一个活动,使用带有导航XML图的导航组件在片段之间导航。

我们采取了这一做法:

  • 每次迁移一个片段
  • 为每个片段创建一个@Composable屏幕,该屏幕提供与片段相同的UI
  • 从片段onCreateView()设置内容到新创建的屏幕

现在,假设我们有Fragment1包含一些操作来导航到Fragment2。在原始代码中,我们将在Fragment1中调用以下内容:

NavHostFragment.findNavController(this).navigate(directionToFragment2)

当创建一个可组合以替换Fragment1 UI时,我们如何实现从该可组合到Fragment2的导航?在composable中,我们可以称之为:

val navController = rememberNavController()

但这似乎是一个不同于碎片使用的导航控制器。有没有办法从可组合的访问到与片段使用的相同的导航控制器?

我们目前看到的唯一选择是将碎片的导航控制器作为参数传递给可组合的,但它看起来不太对。

共有1个答案

蒋奇
2023-03-14

你是正确的,你不能使用rememberNavController()-这将创建一个全新的嵌套NavController只适用于可组合的目的地。

根据测试指南,强烈建议避免直接引用任何可组合文件本身中的任何NavController(即,HomeScreen可组合文件)。相反,建议传递一个lambda,当您的可组合文件想要导航时可以触发它。

然后,您的片段(调用ComposeView上的setContent的片段)将负责实现lambda并调用NavHostFragment.findNavController(this)。

作为一个(不太推荐的)替代方案,您也可以使用LocalView.current.findNavController(),因为Fragments也在视图级别填充NavController,并且LocalView指向托管您的ComposeView可组合。

 类似资料:
  • 我一直试图获得一个简单的web操作来向API发出一个经过身份验证的get请求(我已经从示例代码中删除了实际的url和秘密)。 我已经在本地成功地运行了这一点,但是当我测试web动作时,它只是在记录“调用Axios”之后死亡。 它不会报告错误,我尝试实现一个承诺,认为线程在api响应之前就结束了,但没有效果。有什么线索吗?

  • 问题内容: 我想使用Android Studio使用Gradle构建工具开发应用程序。我无法在上插入存储库和库。我的文件如下: 如何在项目中添加OpenCV? 问题答案: 您可以在Android Studio中轻松完成此操作。 请按照以下步骤将Open CV作为库添加到您的项目中。 libraries在项目主目录下创建一个文件夹。例如,如果您的项目是OpenCVExamples,则将创建一个Ope

  • 我想使用Android Studio开发一个应用程序使用Gradle构建工具。我无法在上插入OpenCV repo和库。我的文件如下所示: 我如何在我的项目中添加OpenCV?

  • 问题内容: 我有一个简单的Entitly类,(和单独类中的字段)。然后,我使用Spring Data()访问数据库(MySql),使用常规ID,查询可以正常工作,无论是Spring生成的查询还是我自己编写的查询。与我没有设法创建正确的查询。我想做的是选择所有id(发生某些情况的EmbeddedId字段之一),这里有一些代码示例,也许有人会知道如何解决它。 实体类: EmbeddedId类: 和存储

  • 问题内容: 我正在研究控制建筑物的光和热的项目。后端(用Java编写)将在Mac Mini上运行,并且应该可以通过SOAP进行访问。 我希望将此项目的复杂性降至最低,因为我不希望每个使用它的人都必须设置应用程序服务器。所以到目前为止,我一直使用javax.xml.ws.Endpoint: 这样的效果出奇的好(嘿,您什么时候最后一次只用3行代码看到Java中的东西?),但是现在我正在寻找一种使用HT

  • 问题内容: 我想使用系统蜂鸣器(并且只有在没有蜂鸣器/无法访问蜂鸣器时才使用扬声器)生成具有特定频率和长度(针对不同的声音信号)的蜂鸣声。我知道可以通过使用ioctl来做到这一点,但这需要root访问权限,而这是我所不希望的。 我知道我可以只使用“ beep”命令,但这将是一个依赖关系,如果可能的话,不应使用它(根本没有外部依赖关系,只有基本的linux库和C)。 我目前拥有的是以下代码(但这需要