我使用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
答案 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()
}