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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:51:19