为什么Dart返回类变量报错,而返回其局部拷贝可以正常运行?
Dart非空类型提升规则差异说明
这个报错的核心原因是Dart的类型系统对不同类型变量的非空提升规则不同:
- Dart的类型校验器仅支持对局部变量做自动非空类型提升,类的静态字段、实例字段都不支持自动非空提升。
场景1正常通过的原因
你在场景1中先将静态字段_database赋值给了局部变量testDb,当你执行if (testDb != null)的判断后,类型校验器可以确定这个局部变量在当前作用域内不会被其他逻辑修改,会自动将testDb的类型从可空的Database?提升为非空的Database,和方法声明的返回值类型匹配,因此可以正常通过校验。
场景2报错的原因
你在场景2中直接判断的是类的静态字段_database,就算完成了非空判断,类型校验器也无法保证在判断完成到返回值的间隔中,这个静态字段会不会被其他异步逻辑修改为null,因此不会做类型提升,它的类型依然是Database?,和方法要求返回的非空Database类型不匹配,就会抛出对应的类型错误。
可选修复方案
除了场景1的局部变量中转写法之外,你也可以在确定_database一定非空的前提下,用非空断言符强制声明类型:
if (_database != null) return _database!;
内容的提问来源于stack exchange,提问作者Greg
相关产品推荐
相关产品推荐

