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

Dart二维List添加临时列表后清空临时列表导致已存元素为空问题

问题根因

Dart中的List属于引用类型,你调用totalExperience.add(temp)时,并没有将temp列表的内容复制一份存入二维列表,只是把temp指向的内存对象的引用存入了totalExperience。后续你调用temp.clear()清空的是同一块内存中的内容,自然会导致已经存入totalExperience的列表同步被清空。

你代码的执行逻辑对应效果如下:

  1. 给temp赋值为指向内容为["a","b"]的内存地址A,把地址A存入totalExperience,打印时地址A的内容还是["a","b"],输出[[a, b]]
  2. 调用temp.clear()清空地址A的内容,totalExperience中第一个元素指向的地址A现在是空数组
  3. 给temp赋值为指向内容为["c","d"]的内存地址B,把地址B存入totalExperience,打印时地址A为空、地址B内容为["c","d"],输出[[], [c, d]]
  4. 重复上述逻辑,最终就会得到你看到的实际输出。

修复方案

可选两种修改方式均可实现预期效果:

  • 存入totalExperience时创建副本,避免操作原对象影响已存入的内容
    把totalExperience.add(temp)修改为以下任意一种写法即可:
    totalExperience.add([...temp]); // 用展开操作符生成新列表
    // 或者
    totalExperience.add(temp.toList()); // 调用toList方法生成新列表
    
  • 直接删除所有temp.clear()语句即可
    你每次写temp = ["a", "b"]这类赋值语句时,已经给temp绑定了全新的列表对象,clear操作属于完全多余的逻辑,删除后就不会误清已存入的列表内容。

额外注意:你当前的函数声明加了async关键字,但返回值不是Future类型,如果没有异步逻辑可以直接去掉async修饰,否则需要将返回值类型调整为Future<List<List<String>>>。

内容的提问来源于stack exchange,提问作者Shourya Shikhar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 09:45:03