为什么 Dart 空安全问题在两个地方不一致地出现

Why are Dart null-safety problems showing up inconsistently in 2 places

我有一个 flutter 应用程序。我正在使用 VSCode。当我执行以下操作时,我在两个地方('PROBLEMS' 区域和 'Debug Console':

中报告了以下错误

错误代码:

bool fff = (preferences?.getBool("_wantSpaces"));

错误信息:

"message": "A value of type 'bool?' can't be assigned to a variable of type 'bool'.\nTry changing the type of the variable, or casting the right-hand type to 'bool'.",

如果我像这样修改代码,这两个错误都会消失: 好的代码:

bool fff = (preferences?.getBool("_wantSpaces")) ?? false;

但是,如果我像这样修改代码,只有 'Problems' 中的错误会消失: 一半好的代码:

bool fff = (preferences?.getBool("_wantSpaces"))!;

问题: 为什么报错在2处? 我更愿意使用第二种形式(带有!),但我不能

谢谢

如果您使用 shared_preferences,getBool 可以为 null,并且您将其分配给一个不可为 null 的 bool。如果你想修复你的 linting 错误,你应该让 fff 也可以为空:

bool? fff  = preferences?.getBool("_wantSpaces");

或者像您之前所说的那样使用默认值:

bool fff  = preferences?.getBool("_wantSpaces") ?? false;

这是因为您使用了 ?关于首选项,这意味着它可以为空。因此,如果首选项以某种方式变为 null,则 getBool 不起作用并且整个事物将为 null,但您在这里告诉编译器的是 (preferences?.getBool("_wantSpaces"))!,这意味着整个值永远不会为 null,但事实并非如此,因为正如您定义的那样,首选项可以为空,因此整个事物有可能为空。