You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 14:19:07