Flutter开发中如何从Firebase获取Map列表并转换为实体类对象
核心问题说明
现有代码存在以下错误:
forEach方法无返回值,遍历生成对象的逻辑不会生效,得到的ordersList为空- 直接将Firebase返回的
List<dynamic>类型的products赋值给List<Product>会触发类型转换错误 Equatable的props未传入类字段,会导致后续相等性判断、状态更新逻辑异常fromSnapshot方法返回值类型和实际生成的列表结构不匹配
修正代码
首先确保Product模型实现fromMap转换方法,示例如下:
class Product extends Equatable { final String id; final String name; final num price; final int quantity; const Product({ required this.id, required this.name, required this.price, required this.quantity, }); static Product fromMap(Map<String, dynamic> map) { return Product( id: map['id'] as String, name: map['name'] as String, price: map['price'] as num, quantity: map['quantity'] as int, ); } @override List<Object?> get props => [id, name, price, quantity]; }
修正后的UserCheckoutOrderList模型:
class UserCheckoutOrderList extends Equatable { final String checkoutOrderDate; final Map<String, dynamic> customerAddress; final String customerName; final String customerPhone; final String deliveryFee; final String subTotal; final String total; final List<Product> products; const UserCheckoutOrderList({ required this.checkoutOrderDate, required this.customerAddress, required this.customerName, required this.customerPhone, required this.deliveryFee, required this.subTotal, required this.total, required this.products, }); // 从单个Map转换为单条订单对象 static UserCheckoutOrderList fromMap(Map<String, dynamic> map) { final productList = (map['products'] as List<dynamic>) .map((productMap) => Product.fromMap(productMap as Map<String, dynamic>)) .toList(); return UserCheckoutOrderList( checkoutOrderDate: map['checkoutOrderDate'] as String, customerAddress: map['customerAddress'] as Map<String, dynamic>, customerName: map['customerName'] as String, customerPhone: map['customerPhone'] as String, deliveryFee: map['deliveryFee'] as String, subTotal: map['subTotal'] as String, total: map['total'] as String, products: productList, ); } // 从单个用户文档快照转换为该用户的全部订单列表 // 请将方法内的checkoutOrders替换为你文档中实际存储订单数组的字段名 static List<UserCheckoutOrderList> fromUserDocSnapshot(DocumentSnapshot snapshot) { final docData = snapshot.data() as Map<String, dynamic>; final orderMaps = docData['checkoutOrders'] as List<dynamic>; return orderMaps.map((orderMap) => fromMap(orderMap as Map<String, dynamic>)).toList(); } // 若你需要将多个订单文档转换为订单列表,使用该方法 static List<UserCheckoutOrderList> fromSnapshotList(List<DocumentSnapshot> snapshots) { return snapshots.map((snapshot) { final map = snapshot.data() as Map<String, dynamic>; return fromMap(map); }).toList(); } // 修正props配置 @override List<Object?> get props => [ checkoutOrderDate, customerAddress, customerName, customerPhone, deliveryFee, subTotal, total, products, ]; }
使用示例
获取单个用户的全部订单:
final userDoc = await FirebaseFirestore.instance .collection('checkouts') .doc('用户邮箱') .get(); final List<UserCheckoutOrderList> userOrders = UserCheckoutOrderList.fromUserDocSnapshot(userDoc);
获取所有结账文档的全部订单:
final checkoutCollection = await FirebaseFirestore.instance .collection('checkouts') .get(); final allOrders = checkoutCollection.docs .expand((doc) => UserCheckoutOrderList.fromUserDocSnapshot(doc)) .toList();
内容的提问来源于stack exchange,提问作者senna
相关产品推荐
相关产品推荐

