Flutter/Dart嵌套For与While循环表现异常问题求助
Dart嵌套循环列表异常原因分析与解决方法
异常核心原因
Dart中的列表属于引用类型,直接通过tempList = pickupPolyLineList赋值时,并没有创建新列表,只是让tempList指向原列表的内存地址。这意味着后续对tempList的修改会直接影响原列表,而wayPointsList中添加的所有元素都是同一个列表的引用,所以每次循环后所有元素都会同步变化——这和Python中fruits[:]创建列表副本的逻辑完全不同。
除此之外,两种循环写法还各有额外问题:
For循环的额外问题
- 循环边界错误:
i <= sortedMapList.length会让i遍历到3(原列表长度为3),此时内层循环j < 3会尝试访问sortedMapList[2]之后的元素,存在越界风险。 - 每次循环都复用同一个列表引用,导致所有添加到
wayPointsList的元素指向同一内存地址。
While循环的额外问题
- 内层循环变量
j没有在每次外层循环时重置为0,导致只有第一次外层循环(i=1)时内层循环会执行,后续外层循环中j保持上一次的结果,无法从头遍历元素。
解决方法
针对上述问题,我们需要做三个关键修改:
- 创建列表副本:每次外层循环时,通过
pickupPolyLineList.toList()或扩展运算符[...pickupPolyLineList]创建新的列表副本,避免引用共享。 - 修正循环边界:For循环中使用
i < sortedMapList.length替代i <= sortedMapList.length,避免越界。 - 重置内层循环变量:While循环中每次外层循环开始时,将
j重置为0。
修正后的For循环代码
void main(List<String> arguments) { print('Hello world!'); List sortedMapList = [1, 2, 3]; List pickupPolyLineList = [4, 5, 6]; List tempList = []; List wayPointsList = []; // 修正循环边界:i < 列表长度 for (int i = 0; i < sortedMapList.length; i++) { // 创建列表副本,避免引用共享 tempList = pickupPolyLineList.toList(); for (int j = 0; j < i; j++) { tempList.add(sortedMapList[j]); } print(" Before wayPointsList at index i: $i is: $wayPointsList"); wayPointsList.add(tempList); print(" after wayPointsList at index i: $i is: $wayPointsList\n"); } }
修正后的For循环输出
Hello world! Before wayPointsList at index i: 0 is: [] after wayPointsList at index i: 0 is: [[4, 5, 6]] Before wayPointsList at index i: 1 is: [[4, 5, 6]] after wayPointsList at index i: 1 is: [[4, 5, 6], [4, 5, 6, 1]] Before wayPointsList at index i: 2 is: [[4, 5, 6], [4, 5, 6, 1]] after wayPointsList at index i: 2 is: [[4, 5, 6], [4, 5, 6, 1], [4, 5, 6, 1, 2]]
修正后的While循环代码
void main(List<String> arguments) { print('Hello world!'); List sortedMapList = [1, 2, 3]; List pickupPolyLineList = [4, 5, 6]; List tempList = []; List wayPointsList = []; int i = 0; while (i < sortedMapList.length) { // 创建列表副本 tempList = pickupPolyLineList.toList(); // 每次外层循环重置j为0 int j = 0; while (j < i) { tempList.add(sortedMapList[j]); j++; } print("tempList at index i: $i is: $tempList"); print(" Before wayPointsList at index i: $i is: $wayPointsList"); wayPointsList.add(tempList); print(" after wayPointsList at index i: $i is: $wayPointsList\n"); i++; } }
修正后的While循环输出
Hello world! tempList at index i: 0 is: [4, 5, 6] Before wayPointsList at index i: 0 is: [] after wayPointsList at index i: 0 is: [[4, 5, 6]] tempList at index i: 1 is: [4, 5, 6, 1] Before wayPointsList at index i: 1 is: [[4, 5, 6]] after wayPointsList at index i: 1 is: [[4, 5, 6], [4, 5, 6, 1]] tempList at index i: 2 is: [4, 5, 6, 1, 2] Before wayPointsList at index i: 2 is: [[4, 5, 6], [4, 5, 6, 1]] after wayPointsList at index i: 2 is: [[4, 5, 6], [4, 5, 6, 1], [4, 5, 6, 1, 2]]
内容的提问来源于stack exchange,提问作者Waqad Arshad
相关产品推荐
相关产品推荐

