【问题标题】:dart throw unchecked_use_of_nullable_value error unnecessary?dart 抛出不必要的 unchecked_use_of_nullable_value 错误?
【发布时间】:2022-12-10 06:54:52
【问题描述】:

即使下面的代码已经检查了t.s!=null,dart 仍然会抛出错误:

t.dart:7:26: Error: Property 'length' cannot be accessed on 'String?' because it is potentially null. Try accessing using ?. instead. if (t.s != null && t.s.length > 5) {}

class Test {
  String? s;
}

void main() {
  Test t = Test();
  if (t.s != null && t.s.length > 5) {}
}

添加额外的 var 将解决它如下:

void main() {
  Test t = Test();
  var s = t.s;
  if (s != null && s.length > 5) {}
}

为什么即使 t.s!=null 已经检查过,dart 也会抛出错误?

有没有办法在不添加额外的var的情况下做到这一点?

此外,在 Typescript 中,它不会抛出错误:

function main(t:{s?:string}){
  if(t.s!==undefined && t.s.length > 5){
  }
}

【问题讨论】:

    标签: dart dart-null-safety


    【解决方案1】:

    如果你检查t.s != null,之后你可以安全地将它从 String 转换?到字符串。 (! 会将您从String? 转换为String

    void main() {
      Test t = Test();
      if (t.s != null && t.s!.length > 5) {}
    }
    

    https://dart.dev/null-safety/understanding-null-safety

    “抛弃可空性”经常出现,以至于我们有了新的简写语法。后缀感叹号 (!) 采用左侧的表达式并将其转换为其基础的不可空类型。”

    【讨论】:

    • t.s!.length > 5 也可以在没有 t.s != null 的情况下工作。由于我们已经检查了t.s != null,dart 应该获得足够的信息来跳过t.s.length > 5 上的错误。打字稿可以做到。我很好奇飞镖是否真的不能这样做。
    • 当您有额外的 var 时,它会在第二种情况下进行检查。如果你删除 s!=null 那里,我会给出一个错误..
    【解决方案2】:

    由于 s 可以为 null,因此子类可以将 s 更改为随机返回 null 或字符串的 getter。因此,分析器无法在看到 t.s != null 时正确地将 s 类型提升为非空值,因为它在下一个表达式中可能为空值。这就是将其复制到局部变量的原因,因为再也没有机会这样做了。

    我有一个视频:https://youtu.be/rqS_Q34RcUk

    没有什么可以解决的。那里关于允许库私有类允许这种类型提升的讨论,因为它不能被未知代码覆盖。

    【讨论】:

      猜你喜欢
      • 2022-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 2021-02-13
      • 2021-04-11
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      相关资源
      最近更新 更多