Dart - null 感知运算符,为啥!需要吗? [复制]

Posted

技术标签:

【中文标题】Dart - null 感知运算符,为啥!需要吗? [复制]【英文标题】:Dart - null aware operator, why ! is needed? [duplicate]Dart - null 感知运算符,为什么!需要吗? [复制] 【发布时间】:2021-05-10 14:05:22 【问题描述】:

我们有:

final Widget? body;

稍后在代码中:

final content = Column(
  children: [
    ...items,
    if (body != null) body!
  ],
);

为什么我必须在正文后添加! 符号?

没有!我收到:

元素类型'Widget?'不能分配给列表类型“Widget”。

在 pubspec.yaml 中

environment:
  sdk: '>=2.12.0-0 <3.0.0'

【问题讨论】:

【参考方案1】:

变量或函数后面的感叹号表示将可空变量或函数转换为不可空值。因为您可能知道小部件不能为空。

const insets = EdgeInsets.all(10.0);
Widget? widget1 = insets;
Widget widget2 = insets;
assert(widget1! == widget2);

【讨论】:

这很明显。仔细看看,在代码中,我问 body 是否为空 - if (body != null) body!。对我来说,这应该足够了:if (body != null) body,因为我已经问过 body 是否为空 不,还不够。因为变量是 nullable (Widget?) 但你需要 Widget。所以它类似于类型转换。编译器也会警告你。在 c# 中也有int var = (int)Nullable&lt;int&gt;(1);

以上是关于Dart - null 感知运算符,为啥!需要吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Dart 语法零散知识

Dart 语法零散知识

Dart 语法零散知识

Dart 语法零散知识

▩Dart-空安全(Null Safety)

有人可以解释为啥条件运算符和赋值运算符一起使用时表现奇怪吗?