Flutter/Dart中forEach循环内修改的List循环后为空问题
问题:forEach循环内List更新正常,循环后却为空List
我在forEach循环外声明了一个List,循环内部给这个List赋值时,循环内打印能看到值已更新,但循环结束后打印却得到空List。相关代码及输出如下:
List<List<String>> chunkSizeCollection(List<String> followedList) { int counter = 0; int ongoingCounter = 0; bool isLessThanTen = false; List<List<String>> returnAbleChunkedList = []; List<String> midList = []; log("in followedlist"); followedList.forEach((element) { if (counter == 0) { int difference = followedList.length - ongoingCounter; if (difference < 10) { // log("in difference if: $difference"); isLessThanTen = true; } } midList.add(element); counter++; ongoingCounter++; if (counter == 10 || (isLessThanTen && ongoingCounter == followedList.length)) { returnAbleChunkedList.add(midList); log("returnAbleChunkedList in counter 10 after adding new val is: $returnAbleChunkedList"); //above log works properly and prints the updated list midList.clear(); counter = 0; } }); //this log on the other hand, returns an empty list log("returnAbleChunkedList: $returnAbleChunkedList before return"); return returnAbleChunkedList; }
输出:
[log] returnAbleChunkedList in counter 10 after adding new val is: [[KQTuEPllbmRrlBNvYgZ7oUXwtA63, OZUZOE10IzT8quUFoZbNxZOynU32, fCYIlYemCvbLTc7SpNHw6fCHrcm1, CbcLrtDNOdYZyC23FzEehOrJbKx2, FFvvVHCpPGNKUiXPQD34QdoPqH32, Gk09y59vSVXa1HNhzYvc6Atqnt53, JDO356z8urYQvuktJmc6eNUYqSm2, YesvvNI43gUVYPMfqhG4uRO5t6K2]] [log] returnAbleChunkedList: [[]] before return
解决方法
问题根源
你向returnAbleChunkedList中添加的是midList的引用,而非它的副本。当执行midList.clear()时,会直接清空这个引用指向的内存空间内容。循环内打印时midList还未被清空,所以能看到值;循环结束后midList已被清空,returnAbleChunkedList里保存的引用自然指向空List。
修复代码
将添加midList到结果List的操作改为添加它的副本,比如用midList.toList()或者List.from(midList):
List<List<String>> chunkSizeCollection(List<String> followedList) { int counter = 0; int ongoingCounter = 0; bool isLessThanTen = false; List<List<String>> returnAbleChunkedList = []; List<String> midList = []; log("in followedlist"); followedList.forEach((element) { if (counter == 0) { int difference = followedList.length - ongoingCounter; if (difference < 10) { isLessThanTen = true; } } midList.add(element); counter++; ongoingCounter++; if (counter == 10 || (isLessThanTen && ongoingCounter == followedList.length)) { // 改为添加midList的副本 returnAbleChunkedList.add(midList.toList()); log("returnAbleChunkedList in counter 10 after adding new val is: $returnAbleChunkedList"); midList.clear(); counter = 0; } }); log("returnAbleChunkedList: $returnAbleChunkedList before return"); return returnAbleChunkedList; }
额外优化建议
也可以在每次满足条件时重新创建midList,避免重复清空操作,代码更简洁:
List<List<String>> chunkSizeCollection(List<String> followedList) { int counter = 0; int ongoingCounter = 0; bool isLessThanTen = false; List<List<String>> returnAbleChunkedList = []; List<String> midList = []; log("in followedlist"); followedList.forEach((element) { if (counter == 0) { int difference = followedList.length - ongoingCounter; isLessThanTen = difference < 10; } midList.add(element); counter++; ongoingCounter++; if (counter == 10 || (isLessThanTen && ongoingCounter == followedList.length)) { returnAbleChunkedList.add(midList); log("returnAbleChunkedList in counter 10 after adding new val is: $returnAbleChunkedList"); // 重新创建midList,而非清空原列表 midList = []; counter = 0; } }); log("returnAbleChunkedList: $returnAbleChunkedList before return"); return returnAbleChunkedList; }
内容的提问来源于stack exchange,提问作者Waqad Arshad
相关产品推荐
相关产品推荐

