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。它只能在某些条件语句之后告诉局部变量不为空。