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