Flutter项目Firebase报错求助:API与工具类多代码问题
Flutter项目Firestore相关报错解决方案
报错1:参数类型'StreamTransformer<dynamic, dynamic>'无法分配给参数类型'StreamTransformer<QuerySnapshot*, List>'
原因:Utils.transformer方法的泛型类型未明确指定,导致返回的StreamTransformer类型不匹配。
修复代码:
修改firebase_api.dart中的readBuyingList方法:
static Stream<List<Buy>> readBuyingList() => Firestore.instance .collection('todo') .orderBy(BuyingField.createdTime, descending: true) .snapshots() .transform(Utils.transformer<Buy>(Buy.fromJson)); // 显式指定泛型<Buy>
修改Utils.dart中的transformer方法:
static StreamTransformer<QuerySnapshot, List<T>> transformer<T>( T Function(Map<String, dynamic> json) fromJson) => StreamTransformer<QuerySnapshot, List<T>>.fromHandlers( handleData: (QuerySnapshot data, EventSink<List<T>> sink) { // 后续代码保持不变 }, );
报错2:类型'CollectionReference'未定义'doc'方法
原因:使用的cloud_firestore版本过旧,旧版本创建文档引用的方法是document()而非doc();或未正确导入新版Firestore实例。
修复方案二选一:
- 若使用旧版
cloud_firestore(v0.x),将所有.doc()替换为.document():
// createBuy方法中 final docBuy = Firestore.instance.collection('cart').document(); // updateBuyingList方法中 final docTodo = Firestore.instance.collection('cart').document(buy.cID); // deletedBuyingList方法同理替换
- 若升级到新版
cloud_firestore(v1.x+),替换Firestore.instance为FirebaseFirestore.instance并修正导入:
// 在firebase_api.dart顶部导入新版Firestore import 'package:cloud_firestore/cloud_firestore.dart'; // 替换所有Firestore.instance为FirebaseFirestore.instance final docBuy = FirebaseFirestore.instance.collection('cart').doc();
报错3:类型'Buy'未定义'fromJson' getter
原因:Buy类未实现fromJson静态方法,无法将Firestore返回的JSON数据转换为Buy对象。
修复代码:在BuyingListStore.dart的Buy类中添加fromJson静态方法:
class Buy { String cID; // 其他字段... Buy({required this.cID, /* 其他参数 */}); // 已有toJson方法基础上,添加fromJson static Buy fromJson(Map<String, dynamic> json) { return Buy( cID: json['cID'], // 其他字段根据JSON键值对应赋值 // 例如:createdTime: Utils.toDateTime(json['createdTime']), ); } Map<String, dynamic> toJson() { return { 'cID': cID, // 其他字段... }; } }
报错4:类型'QuerySnapshot'未定义'docs' getter
原因:旧版cloud_firestore中QuerySnapshot的文档列表属性是documents而非docs;若用新版需确保类型转换正确。
修复方案二选一:
- 若使用旧版
cloud_firestore,将data.docs替换为data.documents:
// Utils.dart中的transformer方法 final snaps = data.documents.map((doc) => doc.data()).toList();
- 若使用新版
cloud_firestore,确保doc.data()返回Map<String, dynamic>:
final snaps = data.docs.map((doc) => doc.data() as Map<String, dynamic>).toList();
内容的提问来源于stack exchange,提问作者user19402977
相关产品推荐
相关产品推荐

