Dart/Flutter中向notesSelected添加元素时notesShown长度意外变更问题
问题原因
Dart中列表属于引用类型,两个列表同步变化的核心原因是:notesSelected 和 notesShown 实际指向了内存中的同一个列表对象,你在代码的某个位置执行过类似 notesSelected = notesShown 的直接赋值操作,没有做独立拷贝,所以修改其中任意一个都会同步影响另一个。
常见错误复现场景
你大概率在初始化、数据更新的逻辑中写过类似代码:
// 错误写法:直接赋值后两个变量指向同一个列表实例 notesShown = 从接口/本地存储获取到的Note列表; notesSelected = notesShown;
解决方法
如果需要两个列表独立修改,赋值时要做独立拷贝:
- 如果
Note是不可变对象,仅需要修改列表元素增删逻辑,用浅拷贝即可:
notesSelected = List.from(notesShown); // 或者用展开运算符写法 notesSelected = [...notesShown];
- 如果
Note是可变对象,后续会修改Note实例本身的属性,需要做深拷贝,遍历每个元素创建新的Note实例:
notesSelected = notesShown.map((note) => Note.copyFrom(note)).toList();
验证方法
你可以在添加元素的代码前加一行代码确认两个列表是否指向同一个对象:
print(identical(notesShown, notesSelected));
如果输出为true,就可以完全确认是引用指向同一个对象的问题。
内容的提问来源于stack exchange,提问作者Mijawel
相关产品推荐
相关产品推荐

