【发布时间】:2022-01-25 08:00:33
【问题描述】:
我正在升级一个基于 Flutter 框架的个人包。我注意到 Flutter Text 小部件源代码中的here 有一个空检查:
if (textSpan != null) {
properties.add(textSpan!.toDiagnosticsNode(name: 'textSpan', style: DiagnosticsTreeStyle.transition));
}
但是,textSpan! 仍在使用! 运算符。不应该将textSpan 提升为不可为空的类型而不必使用! 运算符吗?但是,尝试删除操作符会出现以下错误:
An expression whose value can be 'null' must be null-checked before it can be dereferenced. Try checking that the value isn't 'null' before dereferencing it.
这是一个独立的例子:
class MyClass {
String? _myString;
String get myString {
if (_myString == null) {
return '';
}
return _myString; // <-- error here
}
}
我得到一个编译时错误:
错误:“字符串?”类型的值无法从函数“myString”返回,因为它的返回类型为“String”。
或者,如果我尝试获取 _mySting.length,则会收到以下错误:
无法无条件访问属性“length”,因为接收者可以为“null”。
我认为进行空检查会将_myString 提升为不可为空的类型。为什么不呢?
My question 已在 GitHub 上解决,所以我在下面发布答案。
【问题讨论】:
-
这基本上是stackoverflow.com/q/56764592 的另一个版本(我敢肯定还有其他存在的问题)。
-
@jamesdlin,这很有趣。我没有意识到这比 null 安全更普遍。
-
我在the linked question 中提到过,但这里可能也值得指出:dart.dev/tools/non-promotion-reasons 涵盖了这一点
标签: flutter dart type-promotion dart-null-safety