Flutter使用FutureBuilder遇Dart空安全报错无法访问属性如何解决
问题解决方法
根本原因
- 你的
Future和FutureBuilder都没有指定泛型类型,导致snapshot.data的默认类型是dynamic,Dart空安全的类型提升机制对dynamic类型不生效,就算你提前做了非空判断,编译器也无法确定snapshot.data的具体类型和非空状态。 setPurchaserInfo方法没有显式声明返回值类型,默认返回Future<dynamic>,进一步加剧了类型丢失问题。
具体修改步骤
- 给Future变量和异步方法添加明确的泛型类型
原代码:
Future? _purchaserInfoSnapshot; setPurchaserInfo() async {
修改为:
Future<PurchaserInfo>? _purchaserInfoSnapshot; Future<PurchaserInfo> setPurchaserInfo() async {
- 给FutureBuilder指定泛型类型,明确snapshot返回的数据类型
原代码:
return FutureBuilder(
修改为:
return FutureBuilder<PurchaserInfo>(
- 调整判断逻辑(可选,更符合加载逻辑),此时进入else分支时
snapshot.data已经被编译器判定为非空的PurchaserInfo类型,直接访问属性即可:
// 先判断加载状态,再判断数据是否为空,逻辑更通顺 if (snapshot.connectionState != ConnectionState.done || !snapshot.hasData || snapshot.data == null) { return Center( child: Text( 'Connecting...', style: Theme.of(context).textTheme.headline3, )); } else { // 如果你确认PurchaserInfo类的entitlements属性是非空类型,直接这样写即可正常编译 if (snapshot.data.entitlements.active.isNotEmpty) { return Scaffold(...); } // 如果entitlements本身是可空类型,加一层空判断即可 // if (snapshot.data.entitlements?.active.isNotEmpty == true) { else { return MakePurchase(); } }
内容的提问来源于stack exchange,提问作者edn
相关产品推荐
相关产品推荐

