Flutter添加Model到列表时旧元素数据被覆盖问题求助
问题原因与解决方案
核心问题
你遇到的所有旧Model的listCodeMeli被新值覆盖的情况,本质是Dart中List是引用类型导致的:
- 每次创建
ModelFormatMarket时,你直接把_list1传给listCodeMeli参数,这意味着所有ModelFormatMarket实例的listCodeMeli都指向同一个内存地址的List(也就是_list1本身)。 - 当你后续修改
_list1(比如调用clear或者添加新元素),所有共享这个引用的Model实例的listCodeMeli都会同步变化。 - 禁用
tt()后看似正常,只是因为tt()遍历了_list2中的元素,提前触发了对共享List的引用访问,让覆盖问题更早显现,但实际上引用共享的问题一直存在。
修复方案
创建ModelFormatMarket时,给listCodeMeli传入_list1的副本,而非原List的引用。修改onTapBtnOk里的Model创建代码:
_list2.add(ModelFormatMarket( nameMarket: 'name', unique: 'unicode', // 传入List副本,让每个Model拥有独立的List listCodeMeli: List.from(_list1), mobile: 1234));
用_list1.toList()也能达到同样效果,两种方式都会生成新List,和原_list1断开引用关联,后续修改_list1就不会影响已添加到_list2的Model实例了。
额外优化(可选)
你的tt()函数没有真正的异步操作,可改成同步函数:
List<String> tt() { List<String> allCodeMeli = []; for (var element in _list2) { allCodeMeli.addAll(element.listCodeMeli); } return allCodeMeli; }
调用时也无需await:
List list0 = tt();
内容的提问来源于stack exchange,提问作者Mohammad Soleymani
相关产品推荐
相关产品推荐

