代码将解释所有:
//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
如何在第二个列表中执行更改而不影响原始列表?
9条答案
按热度按时间u91tlkcl1#
如果
MyModal
的成员是非基元类型,如String
、int
、double
、num
、bool
,则clone()
方法还需要克隆引用所指向的示例。我认为对于您的用例,使用不可变值是更好的方法,例如使用https://pub.dartlang.org/packages/built_value
ulydmbyx2#
你可以使用List.from()函数.试试这个代码:
kt06eoxx3#
推荐的方法是使用
.toList
或列表文字。k10s72fa4#
我刚刚使用了
thelist2 = thelist1.toList();
,它工作正常ukqbszuj5#
我遇到了同样的问题,List.from()和List.of()不起作用,我必须Map当前列表,从而创建一个新示例。
这样,我就有了一个新示例,可以在需要的地方注入。
b4wnujal6#
把它改成JSON,然后再解析成object。我知道这是一种肮脏的方式。
(+)它工作和更少的代码。(-)它不解析方法。
5jdjgkvh7#
Spread运算符允许您将值从另一个列表插入到集合中,如dart语言教程中所述:https://dart.dev/guides/language/language-tour#lists所以你可以简单地这样做,以避免浅层复制:
将此dartpad视为POC:
https://dartpad.dev/191c4767abc9540c63103044038562da?null_safety=true
wqlqzqxt8#
即
8qgya5xd9#
把这个延长,放在某个地方。
基本上,我们需要对List进行编码和解码,这样它就不会引用前面的List。