[英]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
中并稍后将它们过滤掉(或者如果您只是更喜欢现有样式),您可以:
List
类型以允许可为空的元素。 也就是说,使用<Widget?>[]
而不是<Widget>[]
。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.