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
相关产品推荐
相关产品推荐

