dart 空值检查:为什么我必须在已经检查空值 (!= null) 之后使用空值检查运算符 ('!')
dart null checking: why do i have to use a null check operator ('!') after checking already for null ( != null )
我将我的 flutter 项目更新为 nullsafety 并收到错误消息:
The function can't be unconditionally invoked because it can be 'null'.
Try adding a null check ('!').
对于我已经检查为空的变量。现在执行此操作的正确方法是什么?我知道我可以添加 !
因为我知道它不能为空。但我不明白为什么。如果有更多的代码,它可能会发生,即删除空检查并保留 !
运算符。
这是我的代码示例:
final Function? suggestionsCallback;
if (widget.suggestionsCallback != null &&
widget.defaultSearchPattern.isNotEmpty &&
pattern.isEmpty) {
return await widget.suggestionsCallback(widget.defaultSearchPattern); // here is the error
} else {
return widget.suggestionsCallback != null
? await widget.suggestionsCallback(pattern) // here is the error
: [];
}
你知道变量不能为空,因为你刚刚检查过。编译器没有。所以不幸的是你必须再次告诉它。
实际上您的特定编译器可能足够聪明,但并非所有编译器都如此。你是否有编译时错误不应该取决于编译器有多聪明。因此,该语言将需要 !测试。编译器很可能没有为 !
生成实际测试
快速浏览一下我的代码:
class Hello{
final Function? hello;
Hello(this.hello);
}
class Say{
wow(){
var h1 = Hello(null);
if(h1.hello!=null) h1.hello();
}
}
https://dart.dev/tools/non-promotion-reasons#property-or-this
注意:这里的“提升”是指“在这行代码中确定一个可空值实际上不为空”;
Dart 编译器不够智能,无法推断您的函数在 if 语句之后在代码的那个位置是 NOTNULL。它只能在某些条件语句之后告诉局部变量不为空。
我将我的 flutter 项目更新为 nullsafety 并收到错误消息:
The function can't be unconditionally invoked because it can be 'null'. Try adding a null check ('!').
对于我已经检查为空的变量。现在执行此操作的正确方法是什么?我知道我可以添加 !
因为我知道它不能为空。但我不明白为什么。如果有更多的代码,它可能会发生,即删除空检查并保留 !
运算符。
这是我的代码示例:
final Function? suggestionsCallback;
if (widget.suggestionsCallback != null &&
widget.defaultSearchPattern.isNotEmpty &&
pattern.isEmpty) {
return await widget.suggestionsCallback(widget.defaultSearchPattern); // here is the error
} else {
return widget.suggestionsCallback != null
? await widget.suggestionsCallback(pattern) // here is the error
: [];
}
你知道变量不能为空,因为你刚刚检查过。编译器没有。所以不幸的是你必须再次告诉它。
实际上您的特定编译器可能足够聪明,但并非所有编译器都如此。你是否有编译时错误不应该取决于编译器有多聪明。因此,该语言将需要 !测试。编译器很可能没有为 !
生成实际测试快速浏览一下我的代码:
class Hello{
final Function? hello;
Hello(this.hello);
}
class Say{
wow(){
var h1 = Hello(null);
if(h1.hello!=null) h1.hello();
}
}
https://dart.dev/tools/non-promotion-reasons#property-or-this
注意:这里的“提升”是指“在这行代码中确定一个可空值实际上不为空”;
Dart 编译器不够智能,无法推断您的函数在 if 语句之后在代码的那个位置是 NOTNULL。它只能在某些条件语句之后告诉局部变量不为空。