在Jetpack Compose中使用NavHostFragment

7
我们有一个遗留的应用程序,我们开始将其迁移到 Jetpack Compose 平台。 该应用程序只有一个 Activity,并使用 Navigation 组件及导航 XML 图形在 Fragment 之间进行导航。
我们采用以下方法: - 每次迁移一个 Fragment - 为每个 Fragment 制作一个 @Composable 屏幕,提供与该 Fragment 相同的 UI。 - 从 Fragment 的 onCreateView() 方法中将内容设置为新创建的屏幕。
现在,假设我们有一个 Fragment1,其中包含一些操作以导航到 Fragment2。在原始代码中,我们会在 Fragment1 中调用以下代码:
NavHostFragment.findNavController(this).navigate(directionToFragment2)

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

val navController = rememberNavController()

但这似乎是一个不同的导航控制器,而不是片段使用的那个。 从可组合项获取与片段使用的相同导航控制器的方法是否存在?

目前我们唯一看到的选择是将片段的导航控制器作为参数传递给可组合项,但这看起来并不完美。


1
您还可以在组合中使用像 navigateTo: () -> Unit 这样的参数,如此处所述。 - Gabriele Mariotti
1个回答

12

您是正确的,您不能使用rememberNavController() - 这将创建一个完全新的嵌套的NavController,仅适用于组合目标。

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

然后,您的Fragment(调用setContent在您的ComposeView 上)将负责实现该lambda表达式并调用NavHostFragment.findNavController(this).navigate(directionToFragment2)

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


我刚刚遇到这个问题,想知道你是否有任何见解可以帮助我。我的设置有点不同:一个包含Compose的活动。这个可组合部分包含一个在Scaffold中使用AndroidViewBinding的Fragment,该Scaffold还包含一个BottomNavigation。现在我很难获得NavController,因为我没有一个带有ID的视图(除了FragmentContainerView,但findNavController找不到它)。我可以在AndroidViewBinding的更新lambda中获取控制器,但我想知道是否有更“清晰”的方法来做到这一点? - takecare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接