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

Flutter页面间列表同步问题:阻止返回时自动更新原列表

Flutter页面间传递列表后原列表自动更新的解决办法

问题场景

在Screen A中持有一个列表,通过Navigator.push将该列表传递至Screen B后,在Screen B内修改了列表元素的部分字段。返回Screen A后,发现原列表也被自动更新。需要实现:仅当手动更新Screen A的列表时,它才会发生改变,返回时不自动更新。

相关实体类定义

class PayeeList {
  List<PayeeData>? data;
}


class PayeeData {
  int? id;
  PayeeAttributes? attributes;
}


class PayeeAttributes {
  num? amount;
  String? createdAt;
  String? updatedAt;
  User? user;
}

初始列表及页面跳转代码

List<PayeeData>? data = [];

List<PayeeData> payees=  data.toList();
var result = await Navigator.push(context,
    MaterialPageRoute(builder: (context) => MultiBlocProvider(
         providers: [
              // 为在Stack Overflow分享已移除
         ],
         child: ExpensePayeesScreen(
             title: "Payees",
             isEdit: false,
             paidAmounts:payees,
              totalAmount: 100))),
          );

从Screen B返回后,data列表会被自动更新。

解决办法

问题根源在于data.toList()只是浅拷贝,列表中的PayeeData对象仍与原列表共享引用,修改Screen B中的对象属性会直接影响原列表。通过创建列表的深拷贝(临时数组)传递,即可让Screen B操作独立的对象集合,不会影响原列表。

实现代码如下:

List<PayeeData> temp = [];
expenseData.attributes?.payees?.data?.forEach((element) {
      PayeeAttributes payeeAttributes = PayeeAttributes(amount: element.attributes?.amount ?? 0, user: element.attributes?.user ?? User());
      temp.add(PayeeData(id: element.id, attributes: payeeAttributes));
});

内容的提问来源于stack exchange,提问作者Ivan Roldan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 18:10:03