ste*_*wpf 6 navigation android android-architecture-components
我正在使用 Navigation 组件来显示DialogFragment(<dialog...>...</dialog>在navigation.xml) 并想知道关闭对话框的推荐方法是什么。我自己试了一下,结果如下:
1)dismiss()在DialogFragment:似乎工作正常
2)findNavController().navigateUp():似乎工作正常
3) findNavController().navigate(MyDialogFragmentDirections.actionMyDialogFragmentToMyNormalFragment()): 有效,但会加载目标目的地的新版本,因此根据用例,这可能不是人们想要的。
注:我使用的情况是,MyNormalFragment使用MyDialogFragment得到一些投入,所以以后MyDialogFragment所示,我需要找回的已经存在的实例MyNormalFragment。
所以对我来说,只有 1) 或 2) 是正确的。现在我想知道,1) 和 2) 之间有什么区别吗?
ian*_*ake 12
1) 和 2) 最终都会做同样的事情,但 2) 总是更安全的选择。
当您调用 时dismiss(),DialogFragment被解除并DialogFragment停止(它接收到 的回调onStop())。这会触发 中的侦听器DialogFragmentNavigator,然后NavController通过调用 来更新的状态popBackStack()。
dismiss()但是,是一个异步操作(如DialogFragment源代码中所示- 您会注意到它不使用commitNow()等)。因此,如果您要从 中检查您所在的目的地NavController.getCurrentDestination(),您会看到您仍在对话目的地,尽管已触发解除。
navigateUp(),另一方面,直接进入 NavController。由于您的返回堆栈上有另一个目的地(在 下的那个DialogFragment),NavController源代码显示navigateUp()只是调用popBackStack()-dismiss()最终触发的相同操作。
但是,当它是NavController驱动操作时,NavController同步更新其状态。这意味着在您调用 之后,除了调用 to 's之外navigateUp(),它还会立即更新其getCurrentDestination()内部状态,这就是调用 to 的内容(删除上面提到的观察者以防止双重解雇)。DialogFragmentNavigatorpopBackStack()dismiss()
因此,调用navigateUp()始终是更安全的选择,因为它确保NavController同步更新到正确的状态,而不是依赖FragmentManager的异步计时(这可能意味着由于多点触控等原因,在该时间段内会收到额外的点击事件。 )。
navigate()使用带有 的操作进行调用app:destination将导航到目标的新实例,这不适合返回到之前的实例。
| 归档时间: |
|
| 查看次数: |
2279 次 |
| 最近记录: |