Dart/Flutter中List.clear()与赋值空数组清空列表的实际区别是什么?
问题核心原因
Dart中列表属于引用类型,变量存储的是列表对象在内存中的地址引用,而非列表本身的值拷贝,两种清空操作的底层逻辑完全不同:
- 当使用
pp2 = []时:你是给pp2变量分配了一个全新的空列表对象,pp2的指向直接切换到新的内存地址,之前pp2指向的旧列表对象不会受任何影响,已经存到_carnetListUser1里的VocList实例持有的还是旧列表的引用,数据不会被后续操作篡改。 - 当使用
pp2.clear()时:你只是清空了pp2当前指向的列表对象的所有元素,pp2本身的内存指向没有变化,始终是最开始初始化的那一个列表。这就导致所有已经添加到_carnetListUser1里的VocList实例,它们的smartLearningProgression参数和pp2指向的是同一个列表对象,每次clear都会把所有已保存的列表数据清空,等全部循环执行完,所有VocList持有的都是同一个被最后一次操作过的列表,如果最后一次循环的源数据为空或者后续还有对pp2的清空操作,最终所有参数值都会变成空。
可行的处理方案
- 优先保留你现在的
pp2 = []写法,每次循环生成独立的新列表,从根源上避免不同实例的数据互相影响,逻辑也更直观。 - 如果确实需要使用
clear()复用同一个临时列表,需要在给smartLearningProgression赋值时做一次列表拷贝,示例如下:
_carnetListUser1.add(VocList( // 其他参数不变 smartLearningProgression: List.from(pp2), // 生成pp2的拷贝传给实例 mastery: []));
拷贝后VocList持有的是独立的新列表,后续对原pp2的清空、修改操作都不会影响已保存的数据。
内容的提问来源于stack exchange,提问作者SylvainJack
相关产品推荐
相关产品推荐

