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
相关产品推荐
相关产品推荐

