Flutter异常修复:'String'不是'Map<String, dynamic>'子类型问题
错误原因
你的编码逻辑存在冗余处理: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
相关产品推荐
相关产品推荐

