代码将解释所有: -
//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
如何在不影响原始列表的情况下在第二个列表中执行更改?
提前致谢!
答案 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
的成员属于非基本类型,例如String
,int
,double
,num
,bool
,那么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