我正在升级一个基于Flutter框架的个人包。我注意到here在 Flutter Text 小部件源代码中存在空检查:
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
为不可空类型。为什么不呢?
我的问题已在 GitHub 上解决,所以我在下面发布答案。
Dart 工程师 Erik Ernst在 GitHub 上说:
类型提升仅适用于局部变量。 ...实例变量的提升并不合理,因为它可能会被运行计算并在每次调用时返回不同对象的 getter 覆盖。比照。dart-lang/语言#1188有关与类型提升类似但基于动态检查的机制的讨论,以及一些相关讨论的链接。
所以本地类型的提升是有效的:
String myMethod(String? myString) {
if (myString == null) {
return '';
}
return myString;
}
但实例变量不是final
那些不是私人的就不会得到晋升。 (在 Dart 3.2 之前,非局部变量从未得到提升。)为此,您需要手动告诉 Dart,在这种情况下,您可以使用以下命令来确定实例变量不为 null!
操作员:
class MyClass {
String? _myString;
String myMethod() {
if (_myString == null) {
return '';
}
return _myString!;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)