如何在没有旧参考的情况下在Dart中复制List <T>?

pal*_*ara 2 dart flutter

代码将解释所有:

//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
Run Code Online (Sandbox Code Playgroud)

如何在第二个列表中执行更改而不影响原始列表?

提前致谢!

mos*_*eim 23

您可以使用 List.from() 函数。试试这个代码:

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

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

//copying list
  List<MyModal> secondList = List.from(originalList);
  secondList.addAll(originalList);
  print(originalList);
  print(secondList);
}
Run Code Online (Sandbox Code Playgroud)

  • 这只会执行对象的浅复制,尝试更改原始列表中的 name 值,然后从两者中打印它,它将是相同的。这只适用于简单类型,如 int 或 string。所以,不,不应该选择它作为正确答案。 (10认同)

Cop*_*oad 9

建议的方法是使用.toList或列表文字。

List<int> source = [1];

List<int> copied = source.toList();
List<int> copied2 = [...source];
Run Code Online (Sandbox Code Playgroud)


Lui*_*uiz 7

我遇到了同样的问题,List.from() 和 List.of() 不起作用。我必须映射当前列表,从而创建一个新实例。

List<CompanyBranchesDTO> get companyBranchesCopy {
  return companyBranches.map((e) =>
          CompanyBranchesDTO(id: e.id, name: e.name, isChecked: e.isChecked))
      .toList();
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以在需要的地方注入一个新实例。


Gün*_*uer 6

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();
Run Code Online (Sandbox Code Playgroud)

如果成员MyModal是非原始类型等Stringintdoublenumbool,则clone()方法需要克隆引用指向以及实例。

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

  • 这就是我在回答中写的。如果你有对象的属性,那么你需要递归克隆。请参阅我更新的答案。 (3认同)

Mal*_*aht 5

我刚用过thelist2 = thelist1.toList();,效果很好