当T为对象时,如何在飞镖中创建List <t>的副本,请参见下面的代码

时间:2019-01-11 21:23:33

标签: dart flutter

https://dartpad.dartlang.org/编辑器中,我在下面键入内容来测试我的问题。

根据我的测试显然是list.from函数,仅当T不是对象/类时才创建NEW副本

我测试了list.from的List,它的工作原理类似于魅力,但不是类/对象。

请让我知道如何在代码下面创建T列表的新副本,以便当我们在一个位置更改列表时,另一位置不会更改。

谢谢

void main() {
  List<Status> statuses = <Status>[
    Status(name: 'Confirmed', isCheck: true),
    Status(name: 'Cancelled', isCheck: true),
  ];
  print('statuses = ${statuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

  //this supposed to create a new list of T but apparently only work for non-object
  List<Status> otherStatuses =  new List<Status>.from(statuses);

  print('otherStatuses= ${otherStatuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

 otherStatuses.singleWhere((x)=>x.name=='Cancelled').isCheck=false;

  print('after the changes only on otherStatuses');
  print('statuses = ${statuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

  print('statuses2 = ${otherStatuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

  print('why the original status (cancelled) equal to false?');

}


class Status {
  String name;
  bool isCheck;

  Status({
    this.name,
    this.isCheck,
  });
}

3 个答案:

答案 0 :(得分:5)

要创建新元素的列表,请使用您在代码中已用于其他目的的map()函数:

List<Status> otherStatuses = statuses.map((status)=>Status(name:status.name, isCheck:status.isCheck)).toList()

答案 1 :(得分:0)

关于同一topic的线程不同,可以找到多个解决方案。在dart repository中,他们还讨论了一个克隆函数,并决定不实现它,而他们为此issue

答案 2 :(得分:0)

您也可以使用

List<Status> otherStatuses = List<Status>.generate(statuses.length,(i) => Status(name: statuses[i].name , isCheck:statuses[i].isCheck));

关于为什么?

您的代码无法正常工作,因为新的otherStatuses列表引用了相同的Status对象,因此,当您对其进行更改时,它也更改了原始的{{1 }},因为它是相同的对象