Flutter电台APP报错:'String'不是'index'的'int'子类型求助
问题修复方案
错误原因分析
type 'String' is not a subtype of type 'int' of 'index'这个异常,本质是你把字符串当成数组/列表的索引来用了——大概率是解析AzuraCast API响应时,误将Map对象当作List去取值,或者反过来用数字键访问Map的字符串键。再结合曲目返回空值的情况,核心问题就是API响应的类型解析完全错配。
针对性修复步骤
结合AzuraCast API的常规响应结构,给你具体的修复方案:
1. 先明确API响应的真实结构
你的完整API响应体应该是类似这样的Map结构(示例):
{ "station": { "name": "测试电台", "now_playing": { "song": { "title": "当前播放曲目", "artist": "艺术家名称" } } } }
如果你的第96行代码写了response['station'][0]['now_playing']这类代码,用数字索引去访问Map,直接就会触发那个异常。
2. 修正解析逻辑
把错误的索引方式改成正确的键值访问:
// 错误写法(用数字索引访问Map,必触发异常) var track = response['station'][0]['now_playing']['song']['title']; // 正确写法(用字符串键访问Map) var track = response['station']['now_playing']['song']['title'];
如果是获取历史曲目这类List结构的数据,才需要用数字索引,但要先判断类型:
if (response['history'] is List) { var recentTrack = response['history'][0]['song']['title']; // 这里用数字索引是合理的 } else { // 处理非List的异常情况 }
3. 解决曲目字符串空值问题
在取值时加上空安全判断,避免返回空字符串:
// 用空安全操作符兜底,确保不会返回空值 String trackTitle = response['station']?['now_playing']?['song']?['title'] ?? '暂无曲目'; String trackArtist = response['station']?['now_playing']?['song']?['artist'] ?? '未知艺术家';
4. 类型断言确保解析安全
如果不确定响应的类型,用as做类型断言,或者提前判断类型:
// 强制转换为Map,确保后续取值不会出错 Map<String, dynamic> stationData = response['station'] as Map<String, dynamic>; Map<String, dynamic> nowPlaying = stationData['now_playing'] as Map<String, dynamic>; Map<String, dynamic> songData = nowPlaying['song'] as Map<String, dynamic>; // 最后再取值 String title = songData['title'] ?? '暂无曲目';
调试小技巧
- 在第96行之前打印响应的类型和内容,确认是Map还是List:
print('响应类型:${response.runtimeType}'); print('响应内容:$response'); - 用断点调试,查看变量的实际类型,就能快速定位到底是哪里的索引/键用错了。
内容的提问来源于stack exchange,提问作者Android_devNL
相关产品推荐
相关产品推荐

