跟着Flutter Firebase教程开发时Dart报Object未定义[]错误如何解决?
错误原因
- 核心是你使用的
cloud_firestore依赖版本和教程不一致:教程使用的是2.0.0之前的旧版本,doc.data默认返回Map类型,可以直接用下标取值;2.0.0之后的版本为了实现类型安全,将doc.data()(旧版本是属性,新版本改为方法)的返回值类型声明为Object?,Dart无法确认它的实际结构是Map,所以不允许直接使用[]访问,就会抛出[] isn't defined for Object的报错。
修复方案
快速适配方案
直接将doc.data()的返回值显式强转为Map<String, dynamic>即可,修改后的转换方法如下:
List<Sport> _sportListFromSnapshot(QuerySnapshot snapshot){ return snapshot.docs.map((doc){ // 先强转类型再取值 final data = doc.data() as Map<String, dynamic>; return Sport( name: data['name'] ?? '', sport: data['sport'] ?? '', age: data['age'] ?? 0 ); }).toList(); }
注:原方法返回类型List<Sport?>可以优化为List<Sport>,因为所有返回的Sport实例都是非空的。
生产环境规范方案
通过Firestore提供的withConverter方法提前绑定类型映射,避免后续每次操作都手动强转:
- 先给Sport类新增
fromJson构造方法:
class Sport { final String name; final String sport; final int age; Sport({required this.name, required this.sport, required this.age}); // 新增fromJson构造 Sport.fromJson(Map<String, dynamic> json): this( name: json['name'] ?? '', sport: json['sport'] ?? '', age: json['age'] ?? 0 ); }
- 在获取Firestore集合引用时绑定转换器:
// 替换你原有获取集合的代码 final sportCollection = FirebaseFirestore.instance .collection("你的集合名称") .withConverter<Sport>( fromFirestore: (snapshot, _) => Sport.fromJson(snapshot.data()!), toFirestore: (sport, _) => { 'name': sport.name, 'sport': sport.sport, 'age': sport.age } );
后续通过sportCollection查询得到的快照数据会自动转为Sport类型,不需要再手动解析。
内容的提问来源于stack exchange,提问作者Something You
相关产品推荐
相关产品推荐

