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

Flutter中Firestore返回自定义对象显示Instance of Object如何获取数据

问题原因
  • 泛型类型声明错误:queryData 方法声明返回 Future<List<Object>>、FutureBuilder 也使用 List<Object> 作为泛型,Object 是 Dart 所有类的基类,默认 toString() 仅输出 Instance of 类名,且无法直接访问子类的自定义属性。
  • Firestore 字段读取逻辑有风险:你通过 entries.elementAt(索引) 取值,完全依赖Firestore返回字段的顺序,一旦字段顺序变化、增减字段就会出现数据错位,你当前代码里main_category 和 price 都取了索引14的值,本身就是错误。
  • 自定义类没有重写toString():默认的toString方法不会输出内部属性值。
修复步骤

1. 修正泛型声明

把queryData方法的返回值类型修改为Future<List<ProductDataObject>>:

static Future<List<ProductDataObject>> queryData(String _userID) async {
  // 原有逻辑不变
}

同步修改FutureBuilder的泛型声明:

FutureBuilder<List<ProductDataObject>>(
  future: GetProductData.queryData(_userID),
  builder: (BuildContext context, AsyncSnapshot<List<ProductDataObject>> snapshot) {
    // 原有逻辑
  }
)

2. 修正Firestore字段读取逻辑

不要按索引取值,直接用字段名从Map中读取:

product_data_lst.forEach((list) {
  lst_ProductDataObject.add(
    ProductDataObject(
      eco_shipping: list['eco_shipping'],
      business_status: list['business_status'],
      fairtrade: list['fairtrade'],
      sub_category: list['sub_category'],
      status_color: list['status_color'],
      description: list['description'],
      adress: list['adress'],
      stars: list['stars'],
      delivery_time: list['delivery_time'],
      title: list['title'],
      sell_status: list['sell_status'],
      eco: list['eco'],
      hashTag: list['hashTag'],
      user_id: list['user_id'],
      price: list['price'],
      main_category: list['main_category'], // 修复原来和price同索引的错误
      product_id: list['product_id'],
      create_date: list['create_date']
    ),
  );
});

3. 重写自定义类的toString方法(可选,需要直接打印对象时用)

在ProductDataObject类中添加toString重写:

@override
String toString() {
  return 'ProductDataObject(adress: $adress, business_status: $business_status, create_date: $create_date, delivery_time: $delivery_time, description: $description, eco: $eco, eco_shipping: $eco_shipping, fairtrade: $fairtrade, hashTag: $hashTag, product_id: $product_id, main_category: $main_category, price: $price, sell_status: $sell_status, stars: $stars, status_color: $status_color, sub_category: $sub_category, title: $title, user_id: $user_id)';
}

4. 正确读取对象属性

拿到snapshot.data后,不要直接对整个列表调用toString,可以遍历列表访问每个对象的属性,示例:

else if (snapshot.hasData) {
  final productList = snapshot.data!;
  return ListView.builder(
    shrinkWrap: true,
    itemCount: productList.length,
    itemBuilder: (context, index) {
      // 访问单个对象的属性
      final product = productList[index];
      return customText(product.title, Colors.black, 18, FontWeight.normal, null);
    },
  );
}

内容的提问来源于stack exchange,提问作者user16754196

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:18:03