【问题标题】:dart null checking: why do i have to use a null check operator ('!') after checking already for null ( != null ) [duplicate]飞镖空检查:为什么我必须在已经检查空(!= null)之后使用空检查运算符('!')[重复]
【发布时间】:2021-10-31 15:45:16
【问题描述】:

我将我的颤振项目更新为 nullsafety 并收到错误消息:

函数不能被无条件调用,因为它可以是'null'。 尝试添加一个空检查 ('!')。

对于我已经检查过 null 的变量。现在这样做的正确方法是什么?我知道我可以添加!,因为我知道它不能为空。但我不明白为什么。如果有更多代码,则可能会删除空检查并保留! 运算符。

这是我的代码示例:

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
              : [];
    }

【问题讨论】:

    标签: flutter dart dart-null-safety null-check


    【解决方案1】:

    知道该变量不能为空,因为您刚刚检查过。编译器没有。所以很遗憾,你必须再说一遍。

    实际上,您的特定编译器可能足够聪明,但并非所有编译器都如此。而且你是否有编译时错误不应该取决于编译器有多聪明。因此语言将需要 !测试。编译器很可能没有为 !

    生成实际测试

    【讨论】:

    • Dart 编译器可以对局部变量进行类型提升。对于 member 变量,这是不可能的(无论编译器是否聪明),因为成员访问涉及只能在运行时解决的虚拟调度,并且不知道成员访问是否每次都可能返回不同的值(甚至虽然这样做是一个糟糕的设计)。
    【解决方案2】:

    快速查看我的代码:

    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

    注意:这里的“Promotion”是指“在这行代码中确定一个可空对象实际上不是空的”;

    Dart 编译器不够聪明,无法在 if 语句之后推断出您的函数在代码的该位置为 NOTNULL。它只能在某些条件语句之后告诉局部变量不为空。

    【讨论】:

      猜你喜欢
      • 2022-07-20
      • 2020-08-13
      • 1970-01-01
      • 2021-11-21
      • 2019-03-17
      • 2021-01-24
      • 2022-07-06
      • 2021-11-06
      • 2021-06-17
      相关资源
      最近更新 更多