Dart中使用List.filled创建二维数组出现列表联动问题的原因及解决方法
嗨,我来帮你捋清楚这个问题~
问题原因
你碰到的这个“所有子列表同步变化”的情况,核心是List.filled()这个方法的特性:它的第二个参数是单个对象的引用。当你写List.filled(7, List.filled(15, 0))时,其实是创建了一个包含7个元素的外层列表,但这7个元素全指向同一个长度为15的子列表对象。所以不管你修改哪个索引的子列表,本质都是在操作同一个底层列表,自然所有行都会跟着变啦。
解决方法
要创建真正相互独立的二维数组,得保证每个子列表都是单独的实例,这里有两种常用的实现方式:
方法一:用List.generate()生成独立子列表
List.generate()会为每个索引单独执行生成函数,每次迭代都会创建新的子列表,完美避免引用复用:
List<List<int>> data = List.generate(7, (_) => List.filled(15, 0));
这里的_是占位符参数(我们不需要用到索引值),每次循环都会调用List.filled(15, 0)生成全新的子列表。
方法二:手动循环初始化
如果你更习惯循环的写法,也可以逐个添加独立子列表:
List<List<int>> data = []; for (int i = 0; i < 7; i++) { data.add(List.filled(15, 0)); }
每次循环都新建一个子列表并加入外层列表,同样能保证所有子列表相互独立。
验证效果
修改后的代码执行data[1][0] = 5;后,再打印就会得到你预期的结果:
Index 0: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 1: [5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 2: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 3: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 4: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 5: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Index 6: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
备注:内容来源于stack exchange,提问作者Geralt von Riva

