繁体   English   中英

在 Jetpack Compose 中使用 NavHostFragment

[英]Use NavHostFragment in Jetpack Compose

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

我们正在遵循这种方法:

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

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

NavHostFragment.findNavController(this).navigate(directionToFragment2)

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

val navController = rememberNavController()

但这似乎是与片段使用的导航不同的导航 controller。 有没有办法从可组合访问与片段使用的导航相同的导航 controller?

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

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

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

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

作为一种(不太推荐的)替代方法,您还可以使用LocalView.current.findNavController()作为 Fragments 在视图级别填充NavController并且LocalView指向托管您的 Composable 的ComposeView

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM