Flutter解析API返回JSON映射模型时抛出NoSuchMethodError如何解决
Flutter JSON解析报NoSuchMethodError问题修复
异常信息
接口拉取数据映射自定义模型时抛出未处理异常:
Unhandled Exception: NoSuchMethodError: Class '_InternalLinkedHashMap<String, dynamic>' has no instance method 'call'
错误原因
jsonDecode解析JSON对象后返回值是_InternalLinkedHashMap<String, dynamic>(Dart内置的Map默认实现),该类型没有call方法,不支持parse<Model>(转换函数)这种泛型方法调用写法。- 现有代码中
final resp = parse<BodyModel>((json) => BodyModel.fromJson(json));属于错误写法,本质是把Map实例当成了可调用的方法,直接触发NoSuchMethodError。
修复代码
1. 修正JSON解析逻辑
直接将jsonDecode得到的Map实例传入BodyModel.fromJson工厂构造即可,不需要额外的错误调用:
import 'dart:convert'; import 'package:http/http.dart' as http; Future<BodyModel> fetchJson(http.Client client, String? id) async { final response = await client.get( Uri.parse(uri2), ); if (response.statusCode == 200) { String jsonData = response.body; BodyModel alpha = responseJSON(jsonData); return alpha; } else { throw Exception('Failed to load json data'); } } BodyModel responseJSON(String response) { final parse = jsonDecode(response); // 直接传入解析后的Map做转换,删除错误的泛型调用逻辑 final resp = BodyModel.fromJson(parse); return resp; }
2. 优化模型类容错(可选)
给字段解析增加空值容错,避免接口字段缺失时抛出空指针错误:
class BodyModel { String body; String title; BodyModel({ required this.body, required this.title, }); factory BodyModel.fromJson(Map<String, dynamic> jsonData) { return BodyModel( body: jsonData['body']?.toString() ?? '', title: jsonData['title']?.toString() ?? '', ); } }
注意事项
- 如果接口返回的是JSON数组而非单个对象,
jsonDecode会返回List<dynamic>类型,需要遍历列表逐个调用fromJson做转换,不能直接把整个列表传入单个模型的构造方法。 - 这类
Class 'X' has no instance method 'call'的错误,绝大多数场景都是把类型实例错当成方法/函数调用导致的,优先检查对应位置的调用逻辑即可。
内容的提问来源于stack exchange,提问作者Syed Ammar Bin Farrukh
相关产品推荐
相关产品推荐

