如何在Flutter中将列表值复制到另一个列表

42

我试图将一个列表的值复制到另一个列表中,我使用三个按钮:第一个按钮将一个值附加到mylist中,第二个按钮清除mylist,第三个按钮将mynewlist中的值复制到mylist中。

我尝试过这样做:

List<String> mylist = [
    'Albania',
    'Andorra',
    'Armenia',
    'Austria',
    'Azerbaijan',
    'Belarus',
    'Belgium',
    'Albania',
    'Andorra',
    'Armenia',
    'Austria',
    'Azerbaijan',
    'Belarus',
    'Belgium',
  ];

  List<String> mynewlist = [
    'Albania',
    'Andorra',
    'Armenia',
    'Austria',
    'Azerbaijan',
    'Belarus',
    'Belgium',
    'Albania',
    'Andorra',
    'Armenia',
    'Austria',
    'Azerbaijan',
    'Belarus',
    'Belgium',
  ];



Padding(
                padding: const EdgeInsets.all(5.0),
                child: Row(
                  children: <Widget>[
                    Expanded(
                      child: FlatButton(
                        onPressed: () {
                          setState(() {
                            print('clicked 1st');
                            print(mylist.length);
                            print(mynewlist.length);
                            mylist.add('sdsds');
                          });
                        },
                        child: Container(
                          child: Column(
                            children: <Widget>[
                              Image.asset(
                                'images/bulb.png',
                                width: 100,
                                height: 100,
                              ),
                              Text('bulb')
                            ],
                          ),
                        ),
                      ),
                    ),
                    Expanded(
                      child: FlatButton(
                        onPressed: () {
                          setState(() {
                            print('clicked 2nd');
                            print(mylist.length);
                            print(mynewlist.length);
//after i set mylist = mynewlist; when i click this button it clears the old and new list.
                            mylist.removeRange(0, mylist.length);
                          });
                        },
                        child: Container(
                          child: Column(
                            children: <Widget>[
                              Image.asset(
                                'images/bulb.png',
                                width: 100,
                                height: 100,
                              ),
                              Text('bulb')
                            ],
                          ),
                        ),
                      ),
                    ),
                    Expanded(
                      child: FlatButton(
                        onPressed: () {
                          setState(() {
                            print('clicked 3rd');
                            print(mylist.length);
                            print(mynewlist.length);
                         mylist = mynewlist;
                          });
                        },
                        child: Container(
                          child: Column(
                            children: <Widget>[
                              Image.asset(
                                'images/bulb.png',
                                width: 100,
                                height: 100,
                              ),
                              Text('bulb')
                            ],
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              )


初始时,它可以完美地运行。第二次单击第二个按钮时,它会清除mylist和mynewlist。

我该如何在不清空新列表的情况下复制第二个列表的值?

6个回答

89

请使用myList = List.from(mynewlist);而不是mylist = mynewlist;


3
将mynewlist转换成列表并将其赋值给mylist。 - YYY
4
是的,这可能适用于您,但实际上您并没有复制列表的值。您只是从初始列表中复制了指针。 - Paul
1
这对我不起作用,因为我的列表有子列表,主列表被克隆得很好,但是如果我过滤子列表,即使我使用*myList = List.from(mynewlist);*,原始列表也会受到影响。你有什么想法吗? - Osama Remlawi
@OsamaRemlawi 对我来说,它只影响了克隆列表。https://jdoodle.com/ia/hVs - ibrahimkarahan
我已经得到了答案,并且想将其发布在这里作为深拷贝的参考 https://dev59.com/KWoMtIcB2Jgan1znfCR0 - Osama Remlawi
显示剩余2条评论

14

这是因为你复制了对象的引用(mylist = mynewlist),而不是列表的内容。所以在第一次点击后,mylist有一个指向内存中与mynewlist相同的对象的引用。因此,在它们之一上进行的任何操作都会影响另一个。

要解决问题,您需要保持对象引用完好,并只复制这些列表的内容。

输入图像描述


1
谢谢你的回答。 - Alvin John Babu
抱歉,我没有详细说明这个问题。但是Ibrahim Karahan比我快一步;-) - Logemann

14

使用:

myNewList = [...myOldList]

它从myOldList创建一个浅拷贝到myNewList

更多信息:您可以搜索“Dart中的扩展运算符”。


9

var YOURCOPY = YOURLIST.map((v) => v).toList();


4

自定义类List的深拷贝

如果您有一个类列表,请确保克隆/复制每个类。否则,如果您更改原始列表中的对象,则新列表中的对象也会发生更改。 以下是一种预防方法:

  1. Add a clone() function to your class

    class RandomObject {
    
    RandomObject(this.x, this.y);
    
    //add clone function to your class:
    RandomObject.clone(RandomObject randomObject): this(randomObject.x, randomObject.y);
    
    int x;
    int y;
    }
    
  2. To copy, map through each element and clone it

    final List<RandomObject> original = [RandomObject(1, 2), RandomObject(3, 4)];
    
    final List<RandomObject> copy = original.map((v) => RandomObject.clone(v)).toList();
    

1
源自灵感:深度复制对象 - Paul

1
您还可以在任何可迭代对象(在这种情况下是List)上调用方法:toList(),以创建副本而不是引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接