Flutter null 安全条件小部件

时间:2021-04-12 18:43:20

标签: flutter dart

在 Flutter 引入空安全功能之前,我能够有条件地在列表中添加小部件,如下所示:

actions: <Widget>[
  canCancel
    ? CupertinoDialogAction(
        child: Text(cancelActionText),
           onPressed: () {
             Navigator.pop(context);
           },
      )
    : null,
].where(notNull).toList()

notNull 是一个自制的过滤器,可以过滤掉空对象...

现在有了空安全,这是不可能的,因为小部件列表必须严格非空。 什么是更好的方法?

4 个答案:

答案 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 中并对其进行过滤稍后再出(或者如果您只是更喜欢现有的风格),您可以:

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