有没有办法在使用 navArgs 后清除它们?我有片段 A 用 navArgs 打开片段 B,然后我导航到片段 C 并且用户按下回,所以片段 B 用相同的 navArgs 打开,我不希望这样。
有没有办法在没有 navArgs 的情况下导航回片段 B?
谢谢。
有没有办法在使用 navArgs 后清除它们?我有片段 A 用 navArgs 打开片段 B,然后我导航到片段 C 并且用户按下回,所以片段 B 用相同的 navArgs 打开,我不希望这样。
有没有办法在没有 navArgs 的情况下导航回片段 B?
谢谢。
Juanjo 提出的答案绝对有效。唯一需要注意的是,您不能使用navArgs
属性委托来获取它们,因为它是 wrapped Lazy
。相反,您只需浏览底层arguments
捆绑包。
例如,在 FragmentB
// don't need to pull in the navArgs anymore
// val args: FragmentBArgs by navArgs()
override fun onResume() {
when (FragmentBArgs.fromBundle(arguments!!).myArg) {
"Something" -> doSomething()
}
// clear it after using it
arguments!!.clear()
}
// 现在当我回到这个片段时它们被清除了
我认为您可以在片段 B 被销毁时删除参数
您可以getArguments().clear();
在 onDestroyView() 中使用该方法,或者在您想清除片段中的参数时使用该方法。
打电话arguments?.clear()
是不够的。原因是navArgs()
委托将所有参数保存在本地缓存变量中。此外,这个变量是私有的:
(取自NavArgsLazy.kt)
private var cached: Args? = null
override val value: Args
get() {
var args = cached
if (args == null) {
...
args = method.invoke(null, arguments) as Args
cached = args
}
return args
}
我也觉得这种方法很愚蠢。我的用例是一个深度链接,可将用户导航到我的应用程序主屏幕的特定菜单项。每当用户回到这个主屏幕时(无论从哪里),缓存的参数都会被重新使用,并且用户被迫再次进入深度链接的菜单项。
由于该cached
字段是私有的并且我不想对此使用反射,因此我在这里看到的唯一方法是navArgs
在这种情况下不使用并以老式方式手动获取参数。通过这样做,我们可以在它们被使用一次后将它们清空:
val navArg = arguments?.get("yourArgument")
if (navArg != null) {
soSomethingOnce(navArg)
arguments?.clear()
}