操纵导航图参数

时间:2019-11-11 14:02:15

标签: android kotlin android-architecture-navigation

我使用Android导航图并发送参数。下面是我获取这些参数的方式:

val args: MyFragmentArgs by navArgs()

我自发地做到了:

var args: MyFragmentArgs? by navArgs()

使用它们后,将它们设置为null:

override fun onStart() { // Need to do this in onStart
    useMyArgsOnFirstTimeOpen(args.myObject)
    args = null
}

这显然不起作用,我得到:'在NavArgsLazy类型的委托上缺少setValue方法'

我想这样做以确保仅在第一次打开该片段时才使用这些参数。而且不是在它被杀死并重新启动之后。

我可以对navArgs做些聪明的事情,对其进行更改还是以某种方式包装它以便让我达到想要的效果?

// want to enable either of these
args = null
args.myObject = null

下面是navArgs()的代码

@MainThread
inline fun <reified Args : NavArgs> Fragment.navArgs() = NavArgsLazy(Args::class) {
    arguments ?: throw IllegalStateException("Fragment $this has null arguments")
}

还是解决方案:将args中传递的对象更改为支持清除它的类?即:

args.myObject.clear() // wish to avoid this

2 个答案:

答案 0 :(得分:0)

您可以使用:

lateinit var args: MyFragmentArgs by navArgs()

然后初始化变量

override fun onStart() { // Need to do this in onStart
  args = null
  useMyArgsOnFirstTimeOpen(args.myObject)
}

答案 1 :(得分:0)

我找不到任何方法来操作导航组件生成的 navArgs。当他们使用 arguments 获取导航图中定义的导航参数时,库会保留每个参数的缓存版本并恢复该值。所以 arguments.clear() 不会影响 navArgs() 产生的参数。

因此,如果您只需要使用一次导航参数,我想现在我们必须手动执行此操作:

        val navArg = arguments?.get("homePage")
        if (navArg != null && navArg is HomePage) {
            doSomethingOnlyOnce(navArg)
            arguments?.clear()   
        }