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
相关产品推荐
相关产品推荐

