组件导航,带参数从后台弹出

Posted

技术标签:

【中文标题】组件导航,带参数从后台弹出【英文标题】:Component Navigation , pop from backstack with arguments 【发布时间】:2019-12-23 11:02:01 【问题描述】:

假设我有三个片段,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)

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

【问题讨论】:

【参考方案1】:

您可以简单地通过将popUpTo 属性添加到导航操作来从返回堆栈中弹出片段。通过这种方式,您可以使用带参数的操作进行导航,但具有弹回堆栈行为。

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

See the docs with example for this here.

还有另一个选项,这可能是您描述的情况的开销,但允许使用 popBackStack 方法并发送参数 - 使用“导航返回结果”方法。对于它,片段应该使用接收包的方法实现接口(回调)。在调用 popBackStack 后,在片段管理器中使用 addOnBackStackChangedListener 来触发此方法,提供所有必要的数据。 (在“如何返回结果?”部分中进行了描述: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-ae3e602b880a)

【讨论】:

当然,您可以使用 Google 建议的共享 ViewModel 来保持片段 B 和 C 可访问的必要数据,而不是直接在片段之间传递参数。这样你就可以继续使用popBackStack

以上是关于组件导航,带参数从后台弹出的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 实现从底部弹出带手势拖拽的列表弹窗的功能

javascript弹出带文字信息的提示框效果

html怎么弹出带按钮和文字的信息框?

带参数的 routerLink 正在更改 URL 但不导航或重新加载组件

使用Android导航组件时如何从后台获取片段?

移动端 input 获取焦点后弹出带enter(类似于搜索,确定,前往)键盘,以及隐藏系统键盘