0

我有一个String类型 arg 从NewCodeFragmentto发送MainFragment

如果我设置了一个默认值,那么我会得到一个“参数太多”的错误。

如何设置默认值?我的理解是,如果我发送一个 arg,那么目标片段将接收 arg,否则它将接收默认值。错误的?

问题代码:

navigationXML:

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

没有问题的代码:

navigationXML:

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

另一个没问题的代码:

navigationXML:

<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
4

2 回答 2

2

如果您的片段参数具有默认值,则生成的构建器方法将没有参数。您需要在 xDirections 对象上单独设置该片段参数的值。应该有一个方法来设置每个参数。为了使您的示例正常工作,您需要执行类似使用 Java 的操作:

String aArg = "abc";
NewCodeFragmentDirections.ActionNewCodeFragmentToMainFragment direction = 
    NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment().aArg(aArg);
this.findNavController().navigate(direction)

在 Kotlin 中,这可能看起来像:

this.findNavController().navigate(
    NewCodeFragmentDirections.actionNewCodeFragmentToMainFragment().apply {
        aArg = "abc"
})
于 2022-01-06T15:59:41.980 回答
0

我喜欢最后一种方法。这里的参数可以有默认值。如果您有一个标准值而不是在参数中传递它,我的建议是您将其保留在将接收参数的目标片段中。因此,您不必在任何地方添加相同的默认字符串。如果defaultValuefromargsnull,您可以使用该片段上的值。

<argument
    android:name="aArg"
    app:argType="string"
    app:nullable="true"
    android:defaultValue="@null" />

例如,3 个片段 A、B 和 C 正在使用 args 进入片段 X。A通过"abc",B和C通过null。现在,您可以在从 args 读取时获得 Fragment X 中的条件,

val aArgument = safeArgs.aArg?.let {
    // Use it
    it
} else {
    // Use the default String
    "This is your default string"
}
于 2021-05-06T09:01:21.070 回答