在 Flutter 引入空安全功能之前,我能够有条件地在列表中添加小部件,如下所示:
actions: <Widget>[
canCancel
? CupertinoDialogAction(
child: Text(cancelActionText),
onPressed: () {
Navigator.pop(context);
},
)
: null,
].where(notNull).toList()
notNull
是一个自制的过滤器,可以过滤掉空对象...
现在有了空安全,这是不可能的,因为小部件列表必须严格非空。 什么是更好的方法?
答案 0 :(得分:5)
只需在 if
中使用 List
:
<Widget>[
if (true) Widget(),
]
代码示例:
actions: <Widget>[
if (canCancel)
CupertinoDialogAction(
child: Text(cancelActionText),
onPressed: () {
Navigator.pop(context);
},
),
]
答案 1 :(得分:2)
只需将您的 null 替换为空的、大小为零的 SizedBox
。
SizedBox(width: 0, height: 0)
或者按照评论中的建议:
SizedBox.shrink()
答案 2 :(得分:2)
作为 YoBo suggested,在这里使用 collection-if
是更好的方法,但如果出于某种原因您需要能够将 null
存储在 List
中并对其进行过滤稍后再出(或者如果您只是更喜欢现有的风格),您可以:
List
类型以允许可空元素。也就是说,使用 <Widget?>[]
而不是 <Widget>[]
。Iterable.whereType
来过滤掉 null
值。actions: <Widget?>[
canCancel
? CupertinoDialogAction(
child: Text(cancelActionText),
onPressed: () {
Navigator.pop(context);
},
)
: null,
].whereType<Widget>().toList();
答案 3 :(得分:1)
if
并不新鲜,因为它是几年前在 Dart 2.3 中添加的。即使在空安全之前,您也不允许为小部件返回 null
。您可能不会在 NNBD 之前看到编译时警告,但这是一个运行时错误。
正如我在此 answer 中提到的(尽管该答案不适用于您的情况),您可以使用 if
条件甚至像这样的三元运算符:
Column(
children: [
if (condition) Text(''),
condition ? Text('') : Container(),
],
)