0

我正在使用具有空安全模式的 Dart。我在下一个代码中有问题。

List<JobModel> _jobList = [];
// ...
if(_jobList.isNotEmpty) { 
  for(var job in _jobList) {
     if(job.cmd_args != null) {
       numbersOfAlreadyActiveJobs.addAll(job.cmd_args.replaceAll('(', '').replaceAll(')','').split('=')[1].split(',').map(int.parse).toList());
     }  
  }

我收到下一个错误:

在此处输入图像描述

但为什么?我正在检查job.cmd_args != null

4

1 回答 1

1

Dart 只提升局部变量,这适用于类型和空值。

当你这样做时if (job.cmd_args != null) ...,它不允许编译器假设任何以后的评估job.cmd_args也将返回一个非空值。在不了解整个程序的情况下,它无法知道这一点(以确保没有任何东西实现JobModelwherecmd_args可能是一个 getter,它在下一次调用时会做一些不同的事情)。即使它知道这一点,我们也不希望本地类型提升依赖于全局信息。这使得它太脆弱,你不能依赖它。有人在其他地方添加类可能会使您的代码不再升级,因此不再编译。

所以,你的测试是不够的。

你可以做的是要么说“我知道我在做什么”,然后!job.cmd_args!.replaceAll. 这是对不可空类型的运行时强制转换,如果该值最终实际上是null在第二次读取(它可能不会,但编译器对“可能”不满意),它将抛出。

或者,您可以引入一个局部变量,该变量可以提升为非 null:

var args = job.cmd_args;
if (args != null) { 
  numberOfAlreadyActiveJobs.addAll(args.replaceAll(...));
}

这里引入一个新的局部变量 ,args然后检查它是否null。如果不是,那么您可以安全地将其用作非null以后,因为局部变量不会受到其他任何地方的代码的影响,因此编译器认为当您以后使用它时它确实具有相同的值。

于 2021-01-29T14:42:29.193 回答