繁体   English   中英

Flutter null 安全条件小部件

[英]Flutter null safety conditional widget

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

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

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

现在有了 null-safety,这是不可能的,因为 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类型以允许可为空的元素。 也就是说,使用<Widget?>[]而不是<Widget>[]
  2. 使用带有不可空类型的Iterable.whereType过滤掉null值。
actions: <Widget?>[
  canCancel
    ? CupertinoDialogAction(
        child: Text(cancelActionText),
           onPressed: () {
             Navigator.pop(context);
           },
      )
    : null,
].whereType<Widget>().toList();

if不是新的,因为它是几年前在 Dart 2.3 中添加的。 即使在 null-safety 之前,您也不允许为小部件返回null 在 NNBD 之前您可能看不到编译时警告,但它是运行时错误。

正如我在此答案中提到的(尽管该答案不适合您的情况),您可以使用if条件甚至三元运算符,如下所示:

Column(
  children: [
    if (condition) Text(''),
    condition ? Text('') : Container(),
  ],
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM