之间到底有什么区别
String id = folderInfo!.first.id; //this works
和
String id = folderInfo?.first.id; //this is an error
我知道?。当value对象为null时返回null,但是执行!的操作!。回来
?.
被称为条件成员访问
最左边的操作数可以为null;例如:foo?。bar从表达式foo中选择属性bar,除非foo为null(在这种情况下,foo?.bar的值为null(
在您的情况下,String id
意味着id
不能具有null
值。但是使用?.
可以返回null
,这就是它显示错误的原因。
!.
如果您知道表达式的计算结果从不为null
,则使用
例如,int类型的变量?可能是一个整数,也可能是null。如果您知道一个表达式的计算结果从不为null,但Dart不同意,那么您可以添加!
来断言它不是null(如果是null,则抛出异常(。
更多和参考:零位安全和操作员的重要概念。
断言运算符(!(
如果确定nullable
表达式不是null
,则使用nullassertion
运算符(!(使Dart将其视为不可为null。
换句话说,将抛出一个error
,如果value
为空,并将破坏您的函数,正如您所知将在不中断的情况下返回null。
如果变量为null
,则!
会抛出错误。如果可能的话,你应该尽量避免这种情况。
如果您确定具有可为null类型的表达式不是null,则可以使用null断言运算符(!(使Dart将其视为不可为null。通过添加!在表达式之后,您告诉Dart该值不会为null,并且将其分配给不可为null的变量是安全的。
在第一种情况下,您定义id不可为null,但当您设置可为null的值时,就会抛出错误。
String id = folderInfo?.first.id;
在第二种情况下,当您使用断言运算符(!(时,它实际上告诉编译器它必须是不可为null的。