Flutter Dart创建三维列表及解决RangeError索引无效问题
解决Flutter中三维列表赋值的RangeError问题
问题原因
你初始化的是一个空一维列表List jawabanTO = [];,但直接尝试访问三维索引jawabanTO[int.tryParse(widget.A)!][int.tryParse(widget.B)!][C]——此时列表没有任何嵌套层级,自然会抛出索引越界错误。Flutter列表不会自动创建嵌套子结构,必须手动初始化每个层级的列表。
解决方案
1. 提前初始化固定尺寸的三维列表
如果知道各维度的最大长度,直接生成对应结构的三维列表:
// 示例:第一维最多5个元素,第二维最多3个,第三维初始为空列表 int maxDimensionA = 5; int maxDimensionB = 3; List<List<List<dynamic>>> jawabanTO = List.generate(maxDimensionA, (_) { return List.generate(maxDimensionB, (__) => []); }); // 安全赋值 int a = int.tryParse(widget.A)!; int b = int.tryParse(widget.B)!; int c = C; // 假设C是合法索引 jawabanTO[a][b][c] = jawaban!;
如果第三维也需要固定长度,把[]替换为List.filled(maxDimensionC, null)即可。
2. 动态创建嵌套子列表(适合索引不固定场景)
如果无法提前确定维度大小,写一个辅助方法动态补全每个层级的列表:
// 辅助方法:确保三维列表的每个层级都存在,再赋值 void set3DValue(List<List<List<dynamic>>> list, int a, int b, int c, dynamic value) { // 补全第一维 while (list.length <= a) list.add([]); // 补全第二维 while (list[a].length <= b) list[a].add([]); // 补全第三维(用null占位,确保索引c存在) while (list[a][b].length <= c) list[a][b].add(null); list[a][b][c] = value; } // 使用示例 List<List<List<dynamic>>> jawabanTO = []; int? a = int.tryParse(widget.A); int? b = int.tryParse(widget.B); int c = C; if (a != null && b != null) { set3DValue(jawabanTO, a, b, c, jawaban!); } else { // 处理widget.A/B无法解析为整数的情况 }
额外注意事项
- 避免直接用
!强制解包int.tryParse的结果:如果widget.A/B不是合法整数,会触发空指针错误,一定要加非空判断。 - 如果第三维是添加元素而非替换已有索引,直接用
jawabanTO[a][b].add(jawaban!)更安全,无需提前补全第三维长度。
内容的提问来源于stack exchange,提问作者Silent Roar
相关产品推荐
相关产品推荐

