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

Flutter实现题目列表随机排序报错及解决方案咨询

Flutter Quiz 题目随机排序异常解决办法

问题根源分析

抛出type 'String' is not a subtype of type 'int' of 'index'异常的核心原因是:你调用shuffle()的mydata并非List类型。shuffle()是Dart中List类的专属方法,只有列表能调用;如果mydata是从JSON解析得到的Map(比如JSON结构为{"questions": [...]}),直接调用mydata.shuffle()会触发类型错误——因为Map的索引是字符串类型,而List的索引是整数类型,代码尝试用整数索引访问Map时就会报错。

正确的shuffle()添加位置与实现步骤

假设你的JSON结构如下:

{
  "questions": [
    {"question": "xxx", "options": ["a", "b", "c"], "answer": "a"},
    {"question": "yyy", "options": ["x", "y", "z"], "answer": "y"}
  ]
}

1. 先提取List类型的题目集合

在JSON解析环节,先从Map中取出List类型的题目列表:

// 假设已将JSON文件内容读取为jsonString变量
final jsonData = json.decode(jsonString);
List<Map<String, dynamic>> questionsList = List.from(jsonData['questions']);

2. 选择合适时机调用shuffle()

  • 页面初始化时随机排序(适用于StatefulWidget):放在initState()中,确保每次进入页面题目顺序随机
@override
void initState() {
  super.initState();
  questionsList.shuffle();
}
  • 手动触发排序(比如点击“重新随机”按钮):在按钮点击事件中调用,同时用setState()刷新UI
ElevatedButton(
  onPressed: () {
    setState(() {
      questionsList.shuffle();
    });
  },
  child: const Text('重新随机题目'),
)

3. 禁止错误调用方式

绝对不要直接对整个JSON解析后的Map调用shuffle(),以下写法是错误的:

final jsonData = json.decode(jsonString);
jsonData.shuffle(); // 错误!jsonData是Map<String, dynamic>,不是List

排查验证步骤

  • 打印mydata的类型:print(mydata.runtimeType),确认是否为List类型;如果输出是_InternalLinkedHashMap<String, dynamic>,说明需要先提取其中的List再调用shuffle。
  • 检查JSON文件结构,确保题目集合是包裹在数组([])中的,而非直接的键值对。

内容的提问来源于stack exchange,提问作者Ankush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 15:55:53