提问者:小点点

在Jetpack Compose中使用NavHostFragment


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

我们采取了这一做法:

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

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

NavHostFragment.findNavController(this).navigate(directionToFragment2)

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

val navController = rememberNavController()

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

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


共1个答案

匿名用户

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

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

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

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