Dart二维List添加临时列表后清空临时列表导致已存元素为空问题
问题根因
Dart中的List属于引用类型,你调用totalExperience.add(temp)时,并没有将temp列表的内容复制一份存入二维列表,只是把temp指向的内存对象的引用存入了totalExperience。后续你调用temp.clear()清空的是同一块内存中的内容,自然会导致已经存入totalExperience的列表同步被清空。
你代码的执行逻辑对应效果如下:
- 给temp赋值为指向内容为
["a","b"]的内存地址A,把地址A存入totalExperience,打印时地址A的内容还是["a","b"],输出[[a, b]] - 调用
temp.clear()清空地址A的内容,totalExperience中第一个元素指向的地址A现在是空数组 - 给temp赋值为指向内容为
["c","d"]的内存地址B,把地址B存入totalExperience,打印时地址A为空、地址B内容为["c","d"],输出[[], [c, d]] - 重复上述逻辑,最终就会得到你看到的实际输出。
修复方案
可选两种修改方式均可实现预期效果:
- 存入
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
相关产品推荐
相关产品推荐

