在 Jetpack Compose 中使用 NavHostFragment

Use NavHostFragment in Jetpack Compose

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

我们采用这种方法:

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

NavHostFragment.findNavController(this).navigate(directionToFragment2)

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

val navController = rememberNavController()

但这似乎是与片段使用的不同的导航控制器。 有没有一种方法可以从可组合项访问与片段使用的导航控制器相同的导航控制器?

我们目前看到的唯一替代方法是将 Fragment 的导航控制器作为参数传递给可组合项,但它看起来不太正确。

你说得对,你不能使用 rememberNavController() - 这将创建一个全新的嵌套 NavController,仅适用于可组合的目的地。

根据 testing guide,强烈建议避免在任何可组合项本身中直接引用 any NavController(即HomeScreen 可组合)。相反,建议传入一个 lambda,您的可组合项可以在它想要导航时触发它。

您的片段(在您的 ComposeView 上调用 setContent 的片段)将负责实现该 lambda 并调用 NavHostFragment.findNavController(this).navigate(directionToFragment2).

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