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

Flutter Dart报错:_InternalLinkedHashMap<String,dynamic>非List<dynamic>子类型

解决Flutter中'_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List'错误

错误原因

  • API返回的是单个对象(Map结构),但你错误地将其强制解析为List类型,触发类型不匹配报错。
  • getAreas方法返回类型定义为Future<List<Areas>>,但实际API返回单个Areas对象,类型定义与实际数据不匹配。

修正步骤

1. 修正getAreas方法的返回类型与解析逻辑

将方法返回类型改为Future<Areas>,移除错误的List解析代码,正确处理API响应:

Future<Areas> getAreas() async {
  final Map<String, String> headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer $accessToken',
  };

  final response = await http.get(
    Uri.parse('https://idonor.ae/api/get-areas'),
    headers: headers,
  );

  if (response.statusCode == 200) {
    final Map<String, dynamic> responseData = json.decode(response.body);
    final Areas areas = Areas.fromJson(responseData);
    print(areas.data.areas); // 打印获取到的地区列表
    return areas;
  } else {
    throw Exception('Failed to load data');
  }
}

2. 调整页面数据展示逻辑

使用FutureBuilder异步获取并展示数据,在页面的build方法中添加以下代码:

@override
Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(title: const Text('地区列表')),
    body: FutureBuilder<Areas>(
      future: getAreas(),
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return const Center(child: CircularProgressIndicator());
        } else if (snapshot.hasError) {
          return Center(child: Text('加载失败:${snapshot.error}'));
        } else if (snapshot.hasData) {
          final List<Area> areasList = snapshot.data!.data.areas;
          return ListView.builder(
            itemCount: areasList.length,
            itemBuilder: (context, index) {
              final Area area = areasList[index];
              return ListTile(
                title: Text(area.name),
                subtitle: Text('${area.state}, ${area.country}'),
              );
            },
          );
        } else {
          return const Center(child: Text('无数据'));
        }
      },
    ),
  );
}

3. 修正initState调用顺序

确保super.initState()在调用getAreas()之前执行(规范写法):

@override
void initState() {
  super.initState();
  getAreas();
}

关键说明

  • 你的Model类Areas已正确匹配API返回结构(包含success、data、message字段),无需修改Model代码。
  • API返回的data字段下的areas才是真正的地区列表,需通过snapshot.data!.data.areas获取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:07:02