Navigation Components popBackStack() 是不是保留 Fragment 状态?

Posted

技术标签:

【中文标题】Navigation Components popBackStack() 是不是保留 Fragment 状态?【英文标题】:Does Navigation Components popBackStack() retains Fragment state?Navigation Components popBackStack() 是否保留 Fragment 状态? 【发布时间】:2019-12-01 23:09:16 【问题描述】:

当我使用新的导航组件从一个片段导航到另一个片段时,我可以通过以下方式成功完成:

btn_walk.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_action))

现在,如果我从目标 Fragment 中弹出 backstack

findNavController().popBackStack()

启动该 Fragments 的 Fragment 再次重新创建自己,但状态没有被保存,我一直在寻找如何修复它,但我真的不知道是否真的如何执行 .add 函数使用导航组件中的navigate()

这个 gif 显示了从一个片段到另一个片段的导航,当从目标片段弹出堆栈时,它会重新创建启动那个片段的片段,而不是保存它的状态。

如果我弹出返回堆栈,使用fragmenttransaction.add() 方法确实可以保持该片段的实例处于活动状态。

有没有办法对导航组件做同样的事情?

我也读过这个Navigation Architecture Fragment Reload Problem,但不清楚应该如何解决。

【问题讨论】:

【参考方案1】:

片段从后台堆栈返回时会自动恢复其保存的状态:对于我们没有导航的情况也是如此。似乎问题在于您如何编码片段。

您可以通过打开“不保留活动”,点击主页按钮,然后返回您的应用并查看 Fragment 是否完美恢复其状态来确认这是您的 Fragment 的问题。您还可以测试正确处理配置更改(即旋转设备)的情况 - 再次,您应该能够准确地恢复您的状态。如果你同时处理这两种情况,那么它在导航中也能很好地工作。

【讨论】:

我强烈建议您提出单独的问题,如果您有特定的视图等,而您在这两种情况下都难以保存/恢复其状态。 谢谢伊恩,明天去看看 他的问题实际上是合法的。这是一个导航组件错误,这里正在讨论它。 ***.com/questions/50485988/… 还有一个错误报告issuetracker.google.com/issues/80029773 @TatiOverflow - 不,这与这个问题无关。 在后台堆栈的片段已经正确保存和恢复它们的状态。该问题链接专门用于返回堆栈上的片段 not

以上是关于Navigation Components popBackStack() 是不是保留 Fragment 状态?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter:在 Navigation.pop 上刷新父小部件

React Native Navigation,如何在 Class Components 之间传递和使用 Props?

React Navigation V5 隐藏底部选项卡

Flutter Navigation 弹出到索引 1

react-navigation 简介

React Navigation - 在屏幕之间导航