为什么我收到此错误警告:空感知操作的操作数'??'具有 'String' 类型,不包括 null。飞镖语言

Why im getting this error Warning: Operand of null-aware operation '??' has type 'String' which excludes null. Dart Language

所以我在学习 Dart 语言中的 SWITCH 和 CASE 语句,在他解释代码的课程中,但是当我得到一个时他没有得到错误。

我得到的错误 : 警告:空感知操作的操作数 '??'具有类型 'String',不包括 null。 字符串``用户名=名字?? “访客用户”;

我的密码是

void learnCondExpr() {
 String name = 'Yamix';
    
 String userName = name ?? "Guest User";
 print(userName);
}

我能得到一些帮助吗:)

所以??操作必须放在可空变量之后。 但是在您的代码中 name 变量是 String,不可为空。 所以 ?? "Guest User" 总是被忽略。 警告说的是 - 此代码无用。

P.S。 如果您将代码修复为 String? name = 'Yamix';,警告将消失。

问题是 name 是 not-nullable 字符串。 您可以通过添加 ?.

将其声明为 nullable 类型

像这样:

String? name = 'Yamix';

请记住,即使您的字符串可以为 null 但您为其分配了一个值,它也将保持不变,这就是为什么您在检查 null 时可能会收到警告的原因:

The left operand can't be null, so the right operand is never executed. Try removing the operator and the right operand

默认情况下,Dart 会假定您声明的任何变量永远不会为空。您将无法将 null 分配给变量,并且在运行时它会抛出错误。如果您尝试像对待 non-nullable 变量那样 可能 为 null,它也会抱怨,这就是您对 '??' 所做的。

您可以在变量类型后使用 ? 来告诉 Dart 您的变量将接受空值。 ?? 允许我们处理 null 值而无需编写额外的代码行

简而言之,x = y ?? z可以描述为

如果左操作数 (y) 为null,则分配右操作数 (z) 即。

void example(String? myString) {
  String? y = myString;
  String z = 'spam';

  var x = y ?? z;
  print(x);
}

void main() {
  example('hello!');
  example(null);
}

// Output:
// hello!
// spam

注意我添加了'?'在第 2 行 'String' 之后,让 Dart 知道 'y' 可能为空。这可以防止我稍后在尝试使用 null-aware 运算符 (??) 将其分配给 'x'.

的代码中出现错误

我希望这不仅能解决您的问题,还能为您提供一些背景知识! :)

Short medium article on Null-aware operators in Dart