组件导航,从带有参数的后退堆栈弹出

Component Navigation , pop from backstack with arguments

提问人:ghita 提问时间:8/17/2019 更新时间:4/23/2020 访问量:11349

问:

假设我有三个片段,A、B、C;

A -> B <-> C

在 B 和 C 之间,它是一种循环关系。B 或 C 片段都需要 ,例如arguments

     val args = Bundle()

     args.putString("StringKeyBC", argValueBtoC)       
     findNavController().navigate(R.id.action_fragmentB_to_fragmentC, args, null)

     args.putString("StringKeyCB", argValueCtoB)       
     findNavController().navigate(R.id.action_fragmentC_to_fragmentB, args, null)

问题是每次我在 B 和 C 之间移动时,碎片都会被添加到后退堆栈中,我不希望这样。如果片段已经要后退堆栈,我只想弹出它,但是如果我使用,我不能再添加参数了:popBackStack

public boolean popBackStack(@IdRes int destinationId, boolean inclusive)

那么,我怎样才能在两个片段之间持续切换,而不每次都将它们添加到后退堆栈中呢?

android-fragments kotlin 导航 android-architecture-navigation

评论


答:

6赞 Roman Potapov 8/21/2019 #1

只需向导航操作添加属性,即可从后退堆栈中弹出片段。这样,您可以使用带有参数但具有弹出回退堆栈行为的操作进行导航。popUpTo

例如,您可以将属性添加到操作 中。这样,每次从 fragmentC 转到 fragmentB 时,您都会从 backstack 中弹出 fragmentC。app:popUpTo="@+id/fragmentB"action_fragmentC_to_fragmentB

请参阅此处的文档和示例。

还有另一个选项,对于您描述的情况来说,这可能是开销,但它允许使用 popBackStack 方法并发送参数 - 使用“使用结果导航回来”方法。对于它,片段应该使用接收捆绑包的方法实现一个接口(回调)。在片段管理器中使用以触发此方法,并在调用 popBackStack 后提供所有必要的数据。(此处在“如何使用结果导航回”一节中进行了描述:https://medium.com/google-developer-experts/using-navigation-architecture-component-in-a-large-banking-app-ac84936a42c2,此处的实现略有不同:https://medium.com/@zawadz88/david-vávra-thank-you-for-this-great-article-ae3e602b880aaddOnBackStackChangedListener)

评论

3赞 Roman Potapov 8/21/2019
当然,你可以按照 Google 的建议使用共享的 ViewModel 来保持片段 B 和 C 的必要数据可访问,而不是直接从一个片段传递到另一个片段的参数。这样,您就可以继续使用 .popBackStack