跟随Flutter Firebase教程写Dart代码时出现Object未定义[]操作符错误
问题根源
你遇到的报错是因为当前使用的cloud_firestore依赖版本高于教程使用的版本,2.0.0及以上版本的cloud_firestore有两个不兼容的API变更:
DocumentSnapshot的data从属性调整为方法,需要通过data()调用才能获取文档数据- 引入了空安全校验,
data()方法默认返回Map<String, dynamic>?类型,需要显式做类型转换
修复代码
直接修正你的转换方法即可,和age字段为int类型无关:
List<Sport> _sportListFromSnapshot(QuerySnapshot snapshot){ return snapshot.docs.map((doc){ // 先调用data()方法获取文档数据,再转换为Map类型 final data = doc.data() as Map<String, dynamic>; return Sport( name: data['name'] as String? ?? '', sport: data['sport'] as String? ?? '', // 显式声明类型,避免隐式转换的编译警告 age: data['age'] as int? ?? 0 ); }).toList(); }
可选优化方案
你可以在定义集合引用时直接绑定类型转换,后续读取数据时无需手动转换,代码更简洁:
// 定义集合引用时绑定Sport类型的序列化/反序列化逻辑 final sportCollection = FirebaseFirestore.instance .collection('你的集合名') .withConverter<Sport>( fromFirestore: (snap, _) { final data = snap.data()!; return Sport( name: data['name'] ?? '', sport: data['sport'] ?? '', age: data['age'] ?? 0, ); }, toFirestore: (sport, _) => { 'name': sport.name, 'sport': sport.sport, 'age': sport.age, }, ); // 后续直接获取Sport类型的列表,无需手动转换 Stream<List<Sport>> getSportList() { return sportCollection.snapshots().map( (snap) => snap.docs.map((doc) => doc.data()).toList(), ); }
内容的提问来源于stack exchange,提问作者Something You
相关产品推荐
相关产品推荐

