我有一个String
类型的arg从NewCodeFragment
发送到MainFragment
。
如果我设置了一个默认值,那么我会得到一个"参数太多"的错误。
如何设置默认值?我的理解是,如果我发送一个arg,那么目标片段将接收该arg,否则它将接收默认值。错误的
问题代码:
navigation
XML:
<argument
android:name="aArg"
app:argType="string"
app:nullable="true"
android:defaultValue="@null" />
fragment.class
:
val aArg="abc"
// build error, it says too many args
this.findNavController().navigate(NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment(aArg))
无问题代码:
navigation
XML:
<argument
android:name="aArg"
app:argType="string"
app:nullable="true"/> // remove android:defaultValue="@null"
fragment.class
:
val aArg="abc"
this.findNavController().navigate(NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment(aArg))
另一个没有问题的代码:
navigation
XML:
<argument
android:name="aArg"
app:argType="string"
app:nullable="true"
android:defaultValue="@null" />
fragment.class
:
val aArg="abc"
this.findNavController().navigate(NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment()) // remove aArg
如果您的fragment参数有默认值,则生成的构建器方法将不会为其提供参数。您需要在xDirections对象上单独设置该fragment的参数值。应该有一个方法来设置每个参数。为了让你的例子发挥作用,你需要做一些事情,比如如果使用Java:
String aArg = "abc";
NewCodeFragmentDirections.ActionNewCodeFragmentToMainFragment direction =
NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment().aArg(aArg);
this.findNavController().navigate(direction)
在Kotlin,这可能看起来像:
this.findNavController().navigate(
NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment().apply {
aArg = "abc"
})
我喜欢最后一种方法。此处的参数可以具有默认值。如果您有一个标准值,而不是在参数中传递它,我的建议是将它保留在将接收参数的目标片段中。因此,您不必到处添加相同的默认字符串。如果args
中的defaultValue
是null
,则可以使用该片段上的值。
<argument
android:name="aArg"
app:argType="string"
app:nullable="true"
android:defaultValue="@null" />
例如,3个片段A、B和C将使用args进行片段X。A通过"abc"
,B和C通过null
。现在,当从参数读取时,您可以在片段X中获得条件
val aArgument = safeArgs.aArg?.let {
// Use it
it
} else {
// Use the default String
"This is your default string"
}
必须有一个生成的方法来设置值。关于作者的例子必须是这样的:
val aArg="abc"
val action = NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment.setAArg(aArg)
findNavController().navigate(action)