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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:17:16