如何在没有旧引用的情况下复制dart中的List <t>?

时间:2018-05-22 05:25:17

标签: 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

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

提前致谢!

8 个答案:

答案 0 :(得分:6)

推荐的方法是使用List.of()构造函数。

List<int> source = [1];
List<int> copied = List.of(source);

答案 1 :(得分:5)

我刚刚使用了thelist2 = thelist1.toList();,它可以正常工作

答案 2 :(得分:4)

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

答案 3 :(得分:3)

您可以使用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);
}

答案 4 :(得分:1)

将其更改为JSON,然后再次将其解析为object。我知道这是肮脏的方式。

(+)它可以工作并且代码更少。 (-)不是解析方法。

答案 5 :(得分:1)

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

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

这样,我就可以在需要的地方插入新实例。

答案 6 :(得分:1)

List<T>.addall(T) worked for me

List<mylist>.addall(oldlist)

答案 7 :(得分:0)

Spread 运算符允许您将另一个列表中的值插入到集合中,如 dart 语言教程中所述: https://dart.dev/guides/language/language-tour#lists 所以你可以简单地这样做以避免浅复制:

final List<MyType> newList = [...oldList];

将此飞镖视为 POC:

https://dartpad.dev/191c4767abc9540c63103044038562da?null_safety=true