Flutter Firebase数据获取报错:期望List<CartItem>却得到List<dynamic>
问题解决:List无法转换为List
问题原因
从Firebase获取的JSON数据中,products字段解析后是List<dynamic>类型,其中每个元素是Map<String, dynamic>,无法直接通过强制类型转换(as List<CartItem>)转为List<CartItem>——Dart无法自动将动态类型的Map转换为自定义的CartItem对象。
解决方案
需要手动遍历products列表,将每个动态类型的Map转换为CartItem实例,具体步骤如下:
给
CartItem添加JSON转模型的构造函数
推荐给CartItem类添加fromJson构造,简化转换逻辑:class CartItem { final String id; final String title; final int quantity; final double price; CartItem({ required this.id, required this.title, required this.quantity, required this.price, }); // 从JSON Map生成CartItem实例 CartItem.fromJson(Map<String, dynamic> json) : id = json['id'], title = json['title'], quantity = json['quantity'], price = json['price'] as double; }修改订单解析中的products转换逻辑
替换原代码中直接强制转换的部分,改为遍历转换:products: (orderData['products'] as List<dynamic>) .map((item) => CartItem.fromJson(item as Map<String, dynamic>)) .toList(),若不想添加
fromJson构造,也可以手动构造实例:products: (orderData['products'] as List<dynamic>) .map((item) => CartItem( id: item['id'], title: item['title'], quantity: item['quantity'], price: item['price'] as double, )) .toList(),额外修正:amount字段的类型转换
JSON解析出的amount通常是num类型,建议显式转为double避免类型错误:amount: orderData['amount'] as double,
修改后的完整fetchAndSetsOrders函数
Future<void> fetchAndSetsOrders() async { final url = "https://ecomercemobileapp-default-rtdb.firebaseio.com/orders.json"; try { final List<OrderItems> loadedorders = []; final response = await http.get(Uri.parse(url)); final extractedData = json.decode(response.body) as Map<String, dynamic>; print(extractedData); if (extractedData.isEmpty) { return; } extractedData.forEach((orderId, orderData) { loadedorders.add( OrderItems( id: orderId, amount: orderData['amount'] as double, products: (orderData['products'] as List<dynamic>) .map((item) => CartItem.fromJson(item as Map<String, dynamic>)) .toList(), dateTime: DateTime.parse(orderData['dateTime']), ), ); }); _ordre = loadedorders; notifyListeners(); } catch (error) { throw error; } }
补充提示
- 确保Firebase中存储的
products字段结构和CartItem的属性完全匹配,否则会出现字段缺失错误。 - 如果Firebase返回的
products可能为空,建议添加空值判断,避免遍历空列表时触发异常。
内容的提问来源于stack exchange,提问作者youcef
相关产品推荐
相关产品推荐

