【问题标题】:How do I conditionally pass argument to Widget in Flutter/Dart?如何有条件地将参数传递给 Flutter/Dart 中的 Widget?
【发布时间】:2020-10-17 20:23:22
【问题描述】:

我想在使用小部件时有条件地传递一个参数。有什么办法吗?

...

return ListTile(
   title: Text("${product.name}"),
   
   // want to conditionally pass subtitle, which is not the right syntax (???)
   if(condition) subtitle: Text("subtitle"), 

   // I know about this
   subtitle: condition? Text("subtitle"): null,
 );
},

...

我知道我们可以在此处使用三元运算符有条件地将值作为 null 传递,但我正在寻找的是跳过参数本身。

以上示例适用于ListTile 小部件。但我的好奇心是知道为任何小部件执行此操作的语法。

【问题讨论】:

  • 你问的是optional named parameters吗?如this?
  • 没有。我正在询问在基于某些条件调用时包含/排除参数的方法。
  • 你能再举一个例子或用例来帮助更好地理解这个问题吗?您可能在其他语言中使用过类似的东西?
  • 同样在optional named parameters 中,您可以完全跳过提供参数。就像前任一样。 Container() 可以有padding 或者你可以跳过它。
  • 最接近我在 Javascript 中可以做的事情是:``` function func(a,b,c){ console.log(...arguments); } func(...[ 1, 2, ...(false ? [3] : []) ]); ```

标签: flutter dart


【解决方案1】:

使用optional named parameters,当需要参数时使用parameter:value 传递其值,否则可以完全跳过。被调用方法null内部需要开发者处理(内部不处理)。

这是一个简化的示例:

void main() {
  doNothing();
  doNothing(index: 1);
  doNothing(description: 'Printing');
  doNothing(index: 1,description: 'Printing');
  
}

void doNothing({int index, String description}) {
  print('Received => $index : $description');
}

输出:

Received => null : null
Received => 1 : null
Received => null : Printing
Received => 1 : Printing

注意:可以在小部件/方法实现中分配默认值,不一定总是null

例子:

void doNothing({int index, String description, String otherDesc = 'Provided By Default'}) {
  print('Received => $index : $description : $otherDesc ');
}

输出:

Received => null : null : Provided By Default

【讨论】:

  • null 不一定是提供给可选参数的默认参数。被调用者可以指定其他内容。
  • 是的@jamesdlin,我已经忘记了。在Widgets 实现中可以分配默认值。
  • 在第二个示例中,otherDesc 后备值仅在不使用参数时使用。但是,如果您正在使用该参数并希望在传入的值为 null 的情况下回退到默认值怎么办?
  • 我认为需要在小部件实现中添加这样的空值检查,但不确定如何处理不受我们控制的小部件。
  • @AkshayGundewar 许多内置小部件回退到非空值。是的,你是对的,我们必须知道我们正在传递什么。
【解决方案2】:

由于 dart 中未显式初始化的变量会自动初始化为 null(如果它们没有默认值),对于小部件来说,不给可选参数提供参数和给参数 @ 没有区别987654322@.

因为将其设置为null 实际上是在跳过参数。如果您不想提供参数,我建议您只使用三元运算符。

【讨论】:

  • 实际上,不仅仅是这个小部件。一般来说,我想知道一种有条件地传递参数的方法(对于任何小部件)。
  • 很高兴知道这一点。在这种情况下,我不知道 null 行为。只是想知道,null case 是由颤振/飞镖世界内部处理的,还是需要由小部件开发人员明确处理的?
  • 这不是真的。如果参数是可选的且未提供,则将使用参数的 default。如果参数没有指定一个,则默认为null,但它可能是一些const 对象。
  • 通常小部件需要逻辑来处理它。在您的 ListTile 字幕中,小部件检查字幕是否为空,如果不是,则仅绘制。 @jamesdlin 是的,你是对的,我没有特别提到这一点。我改变了答案。
猜你喜欢
  • 2021-04-24
  • 2020-12-01
  • 2020-01-21
  • 2019-02-27
  • 2020-09-11
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-27
相关资源
最近更新 更多