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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:25:22