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

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实例,具体步骤如下:

  1. 给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;
    }
    
  2. 修改订单解析中的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(),
    
  3. 额外修正: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:50:27