Flutter中从Firestore获取商品数据后如何保存每个商品的stock与id字段
如何从Firestore查询结果中提取指定字段并保存?
我想要从FireStore中获取一些数据,目前编写的代码如下:
void getProducts() async { QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection("users") .doc(uid) .collection('products') .get(); final fields = querySnapshot.docs.map((doc) => doc.data()).toList(); for (var f in fields) { print(f); } }
代码运行后的输出如下:
I/flutter (14637): {name: Milk, stock: 10, id: 1049}
I/flutter (14637): {name: Bread, stock: 2, id: 51}
我希望保存每个商品的stock和id字段,请问该如何实现?
你可以通过两种常用方式实现这个需求,下面给你详细说明:
方案一:直接提取字段存入Map列表
这种方式简单直接,适合快速实现需求,在转换查询结果时就只保留你需要的字段:
void getProducts() async { QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection("users") .doc(uid) .collection('products') .get(); // 只提取stock和id字段,生成新的Map列表 final productStockIds = querySnapshot.docs.map((doc) { final data = doc.data() as Map<String, dynamic>; return { 'stock': data['stock'], 'id': data['id'] }; }).toList(); // 后续可以直接使用这个列表,比如打印或者存入全局变量 for (var item in productStockIds) { print('商品ID: ${item['id']}, 库存: ${item['stock']}'); } }
方案二:使用自定义类(更规范的工程化做法)
如果你的项目规模较大、需要长期维护,建议定义一个专门的类来存储这些字段,这样类型更安全,代码可读性也更强:
首先定义对应的实体类:
class ProductStock { final int id; final int stock; ProductStock({required this.id, required this.stock}); // 从Firestore的Map数据转换为类实例的工厂方法 factory ProductStock.fromFirestore(Map<String, dynamic> data) { return ProductStock( id: data['id'] as int, stock: data['stock'] as int, ); } }
然后修改查询代码:
void getProducts() async { QuerySnapshot querySnapshot = await FirebaseFirestore.instance .collection("users") .doc(uid) .collection('products') .get(); // 将查询结果转换为ProductStock类的列表 final productStockList = querySnapshot.docs.map((doc) { final data = doc.data() as Map<String, dynamic>; return ProductStock.fromFirestore(data); }).toList(); // 使用时直接访问类的属性,类型更安全 for (var product in productStockList) { print('商品ID: ${product.id}, 库存: ${product.stock}'); } }
两种方案都能帮你提取并保存需要的字段,第二种类的方式更适合长期维护的项目,能避免因字段名拼写错误导致的问题。
内容的提问来源于stack exchange,提问作者Ballazx
相关产品推荐
相关产品推荐

