如何有条件地将参数传递给 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?的主要内容,如果未能解决你的问题,请参考以下文章