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

Flutter调用API时_InternalLinkedHashMap<String, dynamic>错误的解决方法

问题解决:_InternalLinkedHashMap<String, dynamic> 类型不匹配错误

你的核心问题是API返回的不是直接的列表,而是包含list字段的外层对象,直接把整个响应赋值给List变量就会触发类型不匹配错误。下面是两种解决思路:

方案一:保持ResponseType.json(推荐)

直接从响应对象中提取list字段,同时尽量指定明确的类型,避免dynamic带来的问题。

修改ApiProvider代码

// 明确返回类型为List<Map<String, dynamic>>,更安全
Future<List<Map<String, dynamic>>> getGenders() async {
  dio.interceptors.add(LogInterceptor(requestBody: true, responseBody: true));
  try {
    final response = await _request(() => dio.get(
          ApiPath.genders,
          options: Options(responseType: ResponseType.json),
        ));
    // 从响应对象中取出真正的列表数据
    return response['list'] as List<Map<String, dynamic>>;
  } on DioError catch (ex) {
    log(ex.toString());
    rethrow; // 抛出错误让上层处理
  }
}

修改屏幕组件代码

// 指定列表类型,避免隐式dynamic
List<Map<String, dynamic>> genders = [];

Future<void> getGenders() async {
  try {
    final list = await _apiService.getGenders();
    genders = list;
    log(genders.toString()); // 现在输出的是正确的列表结构
  } catch(e) {
    log('获取性别列表失败: ${e}');
    rethrow;
  }
}

方案二:使用ResponseType.plain时解析字符串

如果非要用plain类型,需要先把字符串解析成JSON对象,再提取list字段:

屏幕组件代码修改(需导入dart:convert)

import 'dart:convert';

List<Map<String, dynamic>> genders = [];

Future<void> getGenders() async {
  try {
    final responseStr = await _apiService.getGenders(); // 此时返回的是字符串
    // 把字符串解析成JSON对象
    final responseObj = jsonDecode(responseStr) as Map<String, dynamic>;
    // 提取列表数据
    genders = responseObj['list'] as List<Map<String, dynamic>>;
    log(genders.toString());
  } catch(e) {
    log('解析性别列表失败: ${e}');
    rethrow;
  }
}

进阶优化:使用实体类(推荐)

为了类型安全和代码可读性,建议创建实体类来封装数据:

创建Gender实体类

class Gender {
  final String uuid;
  final String name;

  Gender({required this.uuid, required this.name});

  // 从Map转换为实体对象
  factory Gender.fromMap(Map<String, dynamic> map) {
    return Gender(
      uuid: map['uuid'] as String,
      name: map['name'] as String,
    );
  }
}

修改ApiProvider返回实体列表

Future<List<Gender>> getGenders() async {
  dio.interceptors.add(LogInterceptor(requestBody: true, responseBody: true));
  try {
    final response = await _request(() => dio.get(
          ApiPath.genders,
          options: Options(responseType: ResponseType.json),
        ));
    final list = response['list'] as List<dynamic>;
    // 把每个Map转换为Gender实体
    return list.map((item) => Gender.fromMap(item as Map<String, dynamic>)).toList();
  } on DioError catch (ex) {
    log(ex.toString());
    rethrow;
  }
}

屏幕组件使用实体类

List<Gender> genders = [];

Future<void> getGenders() async {
  try {
    final list = await _apiService.getGenders();
    genders = list;
    // 使用时直接访问属性,比如genders[0].name
  } catch(e) {
    log('获取性别列表失败: ${e}');
    rethrow;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 22:05:57