代码将解释所有:

//modal for list
class MyModal
{
 int myField1;
 List<MyModal> adjacentNodes;
 MyModal(this.myField1)
 {
  adjacentNodes= new List<MyModal>();
 }
}

//pre code
List<MyModal> originalList = new List<MyModal>();
originalList.add(new MyModal(1,"firstBuddy"));

//copying list
List<MyModal> secondList = new List<MyModal>();
secondList.addAll(originalList);

//Modifing copy list
secondList.adjacentNodes.add(new MyModal(2,"anotherBuddy"));

//Also modifies original list
print(originalList[0].childs.length); //prints 1, it should prints 0

如何在不影响原始列表的情况下在第二个列表中执行更改?

推荐答案

class MyModal {
  int myField1;
  String myField2;
  List<MyModal> adjacentNodes;
  MyModal(this.myField1,this.myField2);

  MyModal.clone(MyModal source) : 
      this.myField1 = source.myField1, 
      this.myField2 = source.myField2,
      this.adjacentNodes = source.adjacentNodes.map((item) => new MyModal.clone(item)).toList();
}

var secondList = originalList.map((item) => new MyModal.clone(item)).toList();

如果MyModal的成员是非基元类型,如Stringintdoublenumbool,则clone()方法还需要克隆引用所指向的实例.

我认为对于您的用例,使用不可变值是更好的方法,例如使用https://pub.dartlang.org/packages/built_value

Flutter相关问答推荐

如何解析json中的枚举并忽略 case 敏感性

Firebase Auth异常未被catch捕获

如何创建一个按钮来在Ffltter Webview中转到上一页?

如何组合匹配器

Firebase动态链接已弃用,不应在新项目中使用.Flutter 替代方案

Ffltter:发布版本中的Path NotFoundException

如何将Visual Studio代码中Flutter 应用的包名从com.example.XXX更改为Play Store中受限制的包名称

我想创建一个可滚动的堆叠列表项,每个项都朝向屏幕

Flutter GestureDetector单击问题-堆叠外面的按钮不可点击

Dart 和 flutter 错误无法在您的 PATH 中找到 git

2023 年如何使用 youtube_explode_dart 包下载 URL?

Flutter:如何在 bottomsheet 中创建一个日期 Select 器,如下图所示

访问 AsyncSnapshot 中的嵌套属性

在 CircleAvatar 中放置芯片

如何在 Flutter 中创建 Facebook 创建帖子屏幕?

为什么 setState 不改变我的变量 Flutter?

Flutter:整个判断整个应用生命周期的通用类

setState 不会在第一次更新 - Flutter

参数类型Future>不能分配给参数类型Future>?

Flutter Bloc Todo 示例 - 收听存储库中的单个 todo