【问题标题】:I cannot set Safe Args default value我无法设置 Safe Args 默认值
【发布时间】:2021-05-06 08:37:25
【问题描述】:

我有一个 String 类型 arg 从 NewCodeFragment 发送到 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

【问题讨论】:

    标签: android kotlin android-safe-args


    【解决方案1】:

    如果您的片段参数具有默认值,则生成的构建器方法将没有参数。您需要在 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"
    })
    

    【讨论】:

      【解决方案2】:

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

      <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"
      }
      

      【讨论】:

      • 我的问题是默认值,我不能再传递“abc”,它在我的主题中出现“太多参数”错误作为案例 1。
      • 在我的案例 3 中,您看到我必须删除 aArg 以消除构建错误,在这种情况下,如何将 aArg 传递到目的地?我会永远传递默认值。
      • @caibirdcnb - 您是否尝试在更改参数后重建项目?因为导航参数更改后需要重建项目,否则它会使用之前生成的代码。
      • @caibirdcnb 使用方法 1 并重建项目。这应该可以解决问题。
      • 我确实尝试过重建,我也尝试过使缓存无效/重新启动,但没有运气。
      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2020-05-19
      • 2023-04-01
      相关资源
      最近更新 更多