8

有没有办法在使用 navArgs 后清除它们?我有片段 A 用 navArgs 打开片段 B,然后我导航到片段 C 并且用户按下回,所以片段 B 用相同的 navArgs 打开,我不希望这样。

有没有办法在没有 navArgs 的情况下导航回片段 B?

谢谢。

4

3 回答 3

5

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()
}

// 现在当我回到这个片段时它们被清除了

于 2021-06-25T06:49:33.887 回答
1

我认为您可以在片段 B 被销毁时删除参数

您可以getArguments().clear();在 onDestroyView() 中使用该方法,或者在您想清除片段中的参数时使用该方法。

于 2020-06-29T13:54:23.767 回答
0

打电话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()   
}
于 2021-11-22T12:56:25.793 回答