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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:35:24