如何有条件地将参数传递给 Flutter/Dart 中的 Widget?

Posted

技术标签:

【中文标题】如何有条件地将参数传递给 Flutter/Dart 中的 Widget?【英文标题】:How do I conditionally pass argument to Widget in Flutter/Dart? 【发布时间】: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] : []) ]); ``` 【参考方案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 是的,你是对的,我没有特别提到这一点。我改变了答案。

以上是关于如何有条件地将参数传递给 Flutter/Dart 中的 Widget?的主要内容,如果未能解决你的问题,请参考以下文章

有条件地将任意数量的默认命名参数传递给函数

如何正确地将参数传递给 joomla 组件?

如何正确地将参数传递给基于类的视图测试 Django Rest Framework?

如何正确地将参数传递给rails表单

如何迭代地将参数传递给 R 函数

如何正确地将参数传递给 Django 中的基于类的视图实例?