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

Flutter异常修复:'String'不是'Map<String, dynamic>'子类型问题

问题修复:SharedPreferences存储Map读取时类型不匹配异常

错误原因

你的编码逻辑存在冗余处理:response.body本身就是JSON格式的字符串,你却调用json.encode(response.body)再次对其编码,导致存储的是转义后的JSON字符串(比如原内容{"fname":"lsbsb"}会变成"{\"fname\":\"lsbsb\"}")。后续调用jsonDecode解析时,得到的是原始的JSON字符串而非Map,因此抛出type 'String' is not a subtype of type 'Map<String, dynamic>'异常。

修复方案

方案一:直接存储原始JSON字符串(推荐,减少不必要的编码操作)

修改编码部分代码:

if (response.statusCode == 200) {      
  print(response.body);
  prefs = await SharedPreferences.getInstance();
  // 直接存储已有的JSON字符串,无需二次编码
  prefs.setString("UserData", response.body);
}

解码部分代码保持不变即可,jsonDecode会直接将原始JSON字符串解析为Map<String, dynamic>。

方案二:先解析为Map再编码存储(适用于需要先处理数据的场景)

如果需要先对返回的数据做修改(比如添加、删除字段),可以先将response.body解析为Map,再编码存储:

if (response.statusCode == 200) {      
  print(response.body);
  prefs = await SharedPreferences.getInstance();
  // 先将JSON字符串解析为Map
  Map<String, dynamic> userMap = jsonDecode(response.body);
  // 此处可对userMap进行自定义处理(示例:添加新字段)
  // userMap['new_field'] = 'value';
  // 将处理后的Map编码为字符串存储
  String encodedMap = json.encode(userMap);
  prefs.setString("UserData", encodedMap);
}

解码部分代码同样无需修改,jsonDecode会将编码后的字符串转回Map<String, dynamic>。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:52:07