Flutter Firestore新版代码documents未定义及for循环类型不匹配报错排查
问题原因
错误1:documents getter不存在
cloud_firestore v2.0.0及以上版本做了破坏性API更新:
- 原查询方法
getDocuments()更名为get() - 原
QuerySnapshot的documents属性更名为docs
你已经做了对应修改,该错误实际已解决,剩余报错均来自第二个问题。
错误2:for循环类型不匹配
result.docs返回的是List<QueryDocumentSnapshot<Map<String, dynamic>>>类型,不是直接的Map结构,不能直接赋值给循环变量Map category,需要先调用QueryDocumentSnapshot的data()方法才能拿到文档对应的Map数据。
修复后的完整代码
class CategoryModel { String? image; String? name; CategoryModel({this.image, this.name}); // 接收服务端数据,增加类型限定避免后续类型报错 factory CategoryModel.fromMap(Map<String, dynamic> map) { return CategoryModel(image: map['image'], name: map['name']); } // 发送数据到服务端 Map<String, dynamic> toMap() { return { 'image': image, 'name': name, }; } } class CategoryServices { String collection = "category"; FirebaseFirestore _firestore = FirebaseFirestore.instance; Future<List<CategoryModel>> getCategories() async => _firestore.collection(collection).get().then((result) { List<CategoryModel> categories = []; // 修正循环逻辑:先取文档快照,再调用data()获取Map数据 for (var doc in result.docs) { categories.add(CategoryModel.fromMap(doc.data())); } return categories; }); }
你也可以用更简洁的map写法替换for循环:
Future<List<CategoryModel>> getCategories() async => _firestore.collection(collection).get().then((result) { return result.docs.map((doc) => CategoryModel.fromMap(doc.data())).toList(); });
内容的提问来源于stack exchange,提问作者user17006689
相关产品推荐
相关产品推荐

