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

如何解决Flutter中“List<dynamic>不是Map<String,dynamic>子类型”异常

解决Flutter解析数组型JSON报错:type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'

在Flutter中通过HTTP请求从PHP接口获取数组结构的JSON数据,编写了ProductController的fetchProduct()方法和ProductModel模型类,运行时出现类型不匹配错误:Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'。


错误原因

  • 接口返回的JSON是数组结构(由[]包裹),但当前代码直接将整个响应体传入ProductModel.fromJson(),而该方法接收的是单个Map<String, dynamic>类型的对象,导致类型不匹配。
  • 额外问题:ProductModel的部分字段与JSON返回的键名不对应(比如JSON中的price对应Model的product_price,discription对应product_description,categoryId对应product_category),即使解析成功也会出现字段为空的情况。

修正步骤及代码

1. 修改fetchProduct()方法,正确解析数组型JSON

将响应体解析为List<dynamic>,遍历每个元素并转换为ProductModel对象,再添加到列表中。

2. 修正ProductModel的字段映射

确保fromJson工厂方法中的键名与JSON返回的键完全匹配。

修正后的ProductController代码

import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:http/http.dart' as http;
import 'package:restaurentapp/api_connection/api_connection.dart';
import 'package:restaurentapp/model/product_model.dart';

class ProductController extends GetxController {
  var productList = <ProductModel>[].obs;
  var isLoading = true.obs;

  @override
  void onInit() {
    super.onInit();
    fetchProduct();
  }

  Future<void> fetchProduct() async {
    final response = await http.get(Uri.parse(API.getCardDataProduct));
    if (response.statusCode == 200) {
      // 将响应体解析为List<dynamic>
      List<dynamic> productJsonList = jsonDecode(response.body);
      // 遍历数组,逐个转换为ProductModel对象
      productList.value = productJsonList
          .map((json) => ProductModel.fromJson(json))
          .toList();
      isLoading.value = false; // 数据加载完成后设置为false
    } else {
      Get.snackbar(
        "Error Loading data!",
        'Server Response: ${response.statusCode}: ${response.reasonPhrase.toString()}'
      );
      isLoading.value = false;
    }
  }
}

修正后的ProductModel代码

class ProductModel {
  String productId;
  String title;
  String product_reference;
  String product_price;
  String buying_price;
  String product_description;
  String product_category;
  String unitId;
  String productImagePath;

  ProductModel({
    required this.productId,
    required this.title,
    required this.product_reference,
    required this.product_price,
    required this.buying_price,
    required this.product_description,
    required this.product_category,
    required this.unitId,
    required this.productImagePath,
  });

  factory ProductModel.fromJson(Map<String, dynamic> json) {
    return ProductModel(
      productId: json['productId'],
      title: json['product_title'],
      product_reference: json['product_reference'],
      // 修正:JSON中的键是"price",对应model的product_price
      product_price: json['price'],
      buying_price: json['buying_price'],
      // 修正:JSON中的键是"discription"(注意拼写),对应model的product_description
      product_description: json['discription'],
      // 修正:JSON中的键是"categoryId",对应model的product_category
      product_category: json['categoryId'],
      unitId: json['unitId'],
      productImagePath: json['productImagePath'],
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:09:28