类型转换错误:String无法转为Map<dynamic, dynamic>求助
问题解决:Flutter中JSON字符串转Map的类型转换错误
错误信息
_TypeError (type 'String' is not a subtype of type 'Map<dynamic, dynamic>' in type cast)
场景代码
你从SharedPreferences读取字符串列表后,尝试直接把JSON字符串强转为Map:
final Map<dynamic, dynamic> jsonMap = jsonStr as Map;
其中jsonStr的实际内容是JSON格式字符串:
{"title":"Google — Year in Search 2021","artist":"<unknown>","album":"Download"}
SongModel来自on_audio_query包,要求传入Map类型数据,你的加载方法代码如下:
Future<void> _loadSonMusicList() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); final List<dynamic>? sonMusicListJson = prefs.getStringList(_sonMusicListKey); if (sonMusicListJson != null && sonMusicListJson.isNotEmpty) { final List<SongModel> loadedSongs = []; for (String jsonStr in sonMusicListJson) { final Map<dynamic, dynamic> jsonMap = jsonStr as Map; final SongModel song = SongModel(jsonMap); loadedSongs.add(song); } _sonMusicListe = loadedSongs; } else { _sonMusicListe = []; } notifyListeners(); }
问题原因
你错误地直接将JSON格式的字符串用as Map强制类型转换,字符串和Map是完全不同的类型,这种转换不成立,必然触发类型错误。必须通过JSON解码将字符串解析为Map结构。
解决方案
- 导入
dart:convert包,使用jsonDecode方法将JSON字符串解析为Map; - 替换原代码中的强制转换逻辑,改用
jsonDecode处理。
修正后的完整代码
// 先导入dart:convert包 import 'dart:convert'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:on_audio_query/on_audio_query.dart'; Future<void> _loadSonMusicList() async { final SharedPreferences prefs = await SharedPreferences.getInstance(); // 直接指定类型为List<String>?,避免dynamic类型 final List<String>? sonMusicListJson = prefs.getStringList(_sonMusicListKey); if (sonMusicListJson != null && sonMusicListJson.isNotEmpty) { final List<SongModel> loadedSongs = []; for (String jsonStr in sonMusicListJson) { // 使用jsonDecode解析字符串为Map final Map<dynamic, dynamic> jsonMap = jsonDecode(jsonStr) as Map<dynamic, dynamic>; final SongModel song = SongModel(jsonMap); loadedSongs.add(song); } _sonMusicListe = loadedSongs; } else { _sonMusicListe = []; } notifyListeners(); }
注:如果jsonDecode返回的Map有明确的键值类型(比如String键),可调整为Map<String, dynamic>,保持与SongModel要求一致即可。
内容的提问来源于stack exchange,提问作者Yusuf Brly
相关产品推荐
相关产品推荐

