Flutter读写JSON文件出现_InternalLinkedHashMap类型不匹配报错求解
错误产生原因
Dart的json.decode方法解析JSON字符串后,返回的默认类型是Map<String, dynamic>(因为JSON结构的值可能是字符串、数字、布尔、数组等任意类型,解析阶段无法确定具体值类型,所以统一标记为dynamic类型)。而你的代码中fileContent、jsonFileContent都声明为Map<String, String>类型,直接把Map<String, dynamic>赋值给Map<String, String>变量会触发类型不匹配的报错。
你代码里一共有3处触发该错误的逻辑:
- initState中读取本地JSON后给fileContent赋值的代码
- writeFile方法中读取JSON赋值给jsonFileContent的代码
- writeFile末尾setState时给fileContent赋值的代码
解决方法
有两种可选方案,根据你的业务需求选择即可:
方案1:显式做类型转换(推荐,匹配你现有代码的类型声明)
如果你能确定本地存储的JSON所有值都是字符串类型,直接用Map<String, String>.from()对json.decode的返回结果做类型转换即可,修改三处出错的代码:
- initState部分修改为:
if (fileExists) this.setState( () => fileContent = Map<String, String>.from(json.decode(jsonFile.readAsStringSync())));
- writeFile中读取JSON部分修改为:
Map<String, String> jsonFIleContent = Map<String, String>.from(json.decode(jsonFile.readAsStringSync()));
- writeFile末尾setState部分修改为:
this.setState(() => fileContent = Map<String, String>.from(json.decode(jsonFile.readAsStringSync())));
注意:如果转换时报类型错误,说明你的JSON里存在非字符串类型的值,可根据实际值的类型调整Map的泛型声明。
方案2:调整变量类型声明
如果你后续可能存储非字符串类型的JSON值,直接把变量的类型修改为Map<String, dynamic>即可,不需要做额外转换:
// 把原来的Map fileContent = <String, String>{}; 改成: Map<String, dynamic> fileContent = {}; // 同时把writeFile里的jsonFileContent类型也改成Map<String, dynamic>
内容的提问来源于stack exchange,提问作者Toska 003
相关产品推荐
相关产品推荐

