Flutter使用http请求接口出现_InternalLinkedHashMap错误如何解决?

问题原因
- 核心错误为类型不匹配:
json.decode解析接口返回结果后得到的是Map<String, dynamic>类型,直接将该Map作为参数传给ModelSpescal构造函数时,构造函数要求test参数为String类型,无法直接转换触发运行时报错 - 已定义的JSON解析工厂方法
Fromjson未被调用,没有按照预设逻辑取返回结果里的name字段赋值 - 入口
main函数调用异步方法时未加await,无法获取接口返回的实际数据,只会打印Future实例
修复后的完整代码
import 'dart:convert'; import 'package:http/http.dart' as http; class ServisApi { final client = http.Client(); Future<ModelSpescal> PokomanSpeciesServisApli(int id) async { final Url = Uri.https('pokeapi.co', '/api/v2/pokemon-species/$id/'); print('pokospikal ${Url}'); final response = await client.get(Url); // 先校验接口请求状态 if (response.statusCode == 200) { final response1 = json.decode(response.body); print(response1.toString().isNotEmpty); // 调用已定义的Fromjson工厂方法解析数据 final ResponsFromjson = ModelSpescal.Fromjson(response1); return ResponsFromjson; } else { throw Exception('接口请求失败,状态码:${response.statusCode}'); } } } class ModelSpescal { final String test; ModelSpescal({required this.test}); factory ModelSpescal.Fromjson(Map<String, dynamic> jsonTest) { return ModelSpescal(test: jsonTest['name']); } } // main方法添加async修饰 main() async { // 异步方法调用添加await final result = await ServisApi().PokomanSpeciesServisApli(320); print(result.test); }
额外规范建议
- 调用http请求后优先校验状态码是否为200再做后续解析,避免接口异常时触发解析错误
- Dart官方命名规范建议变量、方法名使用小驼峰格式,比如
pokomanSpeciesServisApli、url、responsFromjson,更符合通用开发习惯
内容的提问来源于stack exchange,提问作者Mohammad Soleymani
相关产品推荐
相关产品推荐

