如何用Map将Firestore购物车数据赋值给Provider的_items变量?
解决Firestore购物车数据转Provider变量的类型错误
错误原因
你直接把QuerySnapshot类型的查询结果赋值给Map<String, CartItem>类型的_items,两者类型完全不匹配,所以触发报错。get()方法返回的是整个集合的查询快照,需要手动遍历快照内的文档,把每个文档数据转换为CartItem对象后,再组装成目标格式的Map。
fromJson/toJson的作用
fromJson:将Firestore返回的Map<String, dynamic>格式数据转换成CartItem对象,读取数据时使用这个方法toJson:将CartItem对象转换成Map<String, dynamic>,用于把数据写入Firestore,本次读取操作不需要用到它
修改后的getItems函数
Map<String, CartItem> _items = {}; void getItems() async { // 获取购物车集合的查询快照 final querySnapshot = await FirebaseFirestore.instance .collection("users") .doc(userId) .collection("Cart") .get(); // 初始化空Map存储转换后的CartItem final Map<String, CartItem> convertedItems = {}; // 遍历每个文档并转换 for (var doc in querySnapshot.docs) { // 用fromJson把文档数据转成CartItem对象 final cartItem = CartItem.fromJson(doc.data()); // 以文档ID作为Map的key,存入转换后的对象 convertedItems[doc.id] = cartItem; } // 赋值给_items变量 _items = convertedItems; // 通知Provider监听者数据更新(必须添加,否则UI不会同步刷新) notifyListeners(); }
补充优化
如果你的CartItem中的id字段需要和Firestore文档ID保持一致,可以在转换时补充赋值:
final cartItem = CartItem.fromJson(doc.data())..id = doc.id;
内容的提问来源于stack exchange,提问作者Mohammed Malek
相关产品推荐
相关产品推荐

