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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 05:07:30