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

类型转换错误: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结构。

解决方案

  1. 导入dart:convert包,使用jsonDecode方法将JSON字符串解析为Map;
  2. 替换原代码中的强制转换逻辑,改用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 10:55:55