Flutter空安全条件小部件



在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中,并在稍后将其过滤掉(或者如果您只是喜欢现有的样式(,您可以:

  1. 更改List类型以允许可以为null的元素。也就是说,使用<Widget?>[]而不是<Widget>[]
  2. 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(),
],
)

相关内容

  • 没有找到相关文章

最新更新