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

Flutter网络请求报错:_Map类型无法转换为String类型

问题定位与解决

错误核心

这个异常直接说明:你在代码里把一个嵌套Map类型(_Map<String, List<Map<String, Map<String, String>>>>)当成了String类型处理,本质是JSON解析环节的类型完全不匹配,问题大概率出在两个关键节点:网络请求后的JSON转换逻辑,或者Model类的字段/解析方法定义。

具体排查与修复步骤

1. 修正网络请求的JSON转换逻辑

确保你先把响应体的字符串转成Map,再传给Model的解析方法,不要搞反类型:

import 'dart:convert';
import 'package:http/http.dart' as http;

// 正确的请求与转换流程
final response = await http.get(Uri.parse('你的接口地址'));
if (response.statusCode == 200) {
  // 必须先把response.body(String)转成Map
  final Map<String, dynamic> jsonMap = jsonDecode(response.body);
  // 用Map生成Model实例
  final targetModel = TargetModel.fromJson(jsonMap);
}
  • 错误示例:如果直接把jsonMap(Map类型)传给需要String参数的方法,或者反过来把response.body直接丢给要求Map的fromJson方法,都会触发这个类型异常。

2. 检查Model类的字段与解析方法

根据接口返回的JSON结构,确保Model的字段类型完全匹配,不能把嵌套的Map/数组当成String:
假设你的接口返回JSON结构如下:

{
  "result": [
    {
      "detail": {
        "name": "xxx",
        "id": "123"
      }
    }
  ]
}

对应的Model类必须定义嵌套结构,而不是把嵌套对象赋值给String字段:

// 正确的嵌套Model示例
class TargetModel {
  final List<ResultItem>? result;

  TargetModel({this.result});

  factory TargetModel.fromJson(Map<String, dynamic> json) {
    return TargetModel(
      result: json['result'] != null 
          ? List<ResultItem>.from(json['result'].map((item) => ResultItem.fromJson(item))) 
          : null,
    );
  }
}

class ResultItem {
  final Detail? detail;

  ResultItem({this.detail});

  factory ResultItem.fromJson(Map<String, dynamic> json) {
    return ResultItem(
      detail: json['detail'] != null ? Detail.fromJson(json['detail']) : null,
    );
  }
}

class Detail {
  final String? name;
  final String? id;

  Detail({this.name, this.id});

  factory Detail.fromJson(Map<String, dynamic> json) {
    return Detail(
      name: json['name'],
      id: json['id'],
    );
  }
}
  • 错误示例:如果把TargetModel里的result字段定义成String? result,解析时就会把List类型的json['result']强行赋值给String字段,直接触发类型不匹配。

3. 验证在线工具生成的Model类

在线JSON转Dart工具可能因JSON层级较深生成错误的类型,你需要手动核对:

  • 确认每个字段的类型和JSON对应值的类型一致:JSON里是数组,Model里必须是List<子Model>;JSON里是嵌套对象,Model里必须是对应子Model类型,绝对不能是String。

快速调试技巧

在解析前打印各层级数据的类型,快速定位不匹配的节点:

final jsonMap = jsonDecode(response.body);
print('根节点类型: ${jsonMap.runtimeType}');
print('result字段类型: ${jsonMap["result"].runtimeType}');

根据打印结果调整Model类的字段类型,确保完全对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:42:39