Flutter/Dart中!操作符的具体作用是什么?
Dart中
!空断言操作符作用及相关问题解答 核心概念说明
!是空断言操作符:作用是强制将可空类型的变量转换为对应的非空类型,相当于你手动向编译器保证该变量此刻一定不为空。如果运行时变量实际为null,会直接抛出CastError异常。- 变量后的
?是条件访问操作符:如果变量为null就直接返回null,否则才执行后续的访问逻辑,该操作符的返回值永远是可空类型。
报错原因
Image.file构造方法的第一个参数要求传入非空的File类型,不接受null值:
- 你虽然提前做了
_selectedFile != null的判断,但因为_selectedFile是类的实例变量或者顶层变量,Dart的类型提升机制对这类变量不生效(编译器无法保证判空后、传参前的这段时间,不会有其他逻辑修改该变量的值变回null),所以编译器仍然认为_selectedFile是File?可空类型,直接传会报错。 - 如果你用
_selectedFile?,按照条件访问的规则,返回值类型还是File?可空类型,不符合Image.file的参数类型要求,自然会抛出编译错误。 - 用
_selectedFile!时,你手动把File?强制转为了非空的File类型,完全匹配参数要求,所以可以正常编译运行。
额外补充
如果_selectedFile是方法内的局部变量,判空之后你甚至不需要加!,直接传_selectedFile即可,编译器会自动做类型提升将其识别为非空类型。
内容的提问来源于stack exchange,提问作者darkstar
相关产品推荐
相关产品推荐

