飞镖无效安全!。对比?-

Dart null safety !. vs ?-

有什么区别
String id = folderInfo!.first.id;   //this works

String id = folderInfo?.first.id; //this is an error

我知道? returns null 当值对象为 null 但 !. return?

断言运算符 (!)

使用空 assertion 运算符 ( ! ) 使 Dartnullable 表达式视为非-如果您确定它不是 null.

,则可为 null

换句话说 !. 如果 value 为 null 将抛出一个 error 并且会破坏你的功能,如你所知 ?. 将 return 无中断。

如果变量是 null! 会抛出错误。如果可能,您应该尽量避免这种情况。

如果您确定具有可为空类型的表达式不为空,则可以使用空断言运算符 (!) 让 Dart 将其视为不可为空。通过增加 !在表达式之后,您告诉 Dart 该值不会为 null,并且将其分配给不可为 null 的变量是安全的。

在你的第一种情况下,你定义了 id 不可为空,但是当你设置为可空值时,然后抛出错误。

String id = folderInfo?.first.id; 

在第二种情况下,当您使用断言运算符 (!) 时,它实际上告诉编译器它必须是不可空的。

?. 被称为 Conditional member access

the leftmost operand can be null; example: foo?.bar selects property bar from expression foo unless foo is null (in which case the value of foo?.bar is null)

在你的例子中,String id 意味着 id 不能有 null 值。但是使用 ?. 可以 return null 这就是它显示错误的原因。

!. 使用 如果您知道表达式永远不会计算为 null.

比如int类型的变量?可能是整数,也可能为空。如果你知道一个表达式永远不会计算为 null 但 Dart 不同意,你可以添加 ! 来断言它不是 null(如果是则抛出异常)。

更多和参考: important-concepts of null-safety and operators.