如何< T>在dart中复制没有旧引用的List?

lx0bsm1f  于 2023-01-06  发布在  其他
关注(0)|答案(9)|浏览(178)

代码将解释所有:

//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

如何在第二个列表中执行更改而不影响原始列表?

u91tlkcl

u91tlkcl1#

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

ulydmbyx

ulydmbyx2#

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

kt06eoxx3#

推荐的方法是使用.toList或列表文字。

List<int> source = [1];

List<int> copied = source.toList();
List<int> copied2 = [...source];
k10s72fa

k10s72fa4#

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

ukqbszuj

ukqbszuj5#

我遇到了同样的问题,List.from()和List.of()不起作用,我必须Map当前列表,从而创建一个新示例。

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

这样,我就有了一个新示例,可以在需要的地方注入。

b4wnujal

b4wnujal6#

把它改成JSON,然后再解析成object。我知道这是一种肮脏的方式。
(+)它工作和更少的代码。(-)它不解析方法。

5jdjgkvh

5jdjgkvh7#

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

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

将此dartpad视为POC:
https://dartpad.dev/191c4767abc9540c63103044038562da?null_safety=true

wqlqzqxt

wqlqzqxt8#

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

List<mylist>.addall(oldlist)
8qgya5xd

8qgya5xd9#

把这个延长,放在某个地方。

import 'dart:convert';

extension ListExtensions on List {
  get() {
    return jsonDecode(jsonEncode(this));
  }
}

基本上,我们需要对List进行编码和解码,这样它就不会引用前面的List。

//import your extension

List productList = ["GG FILTER 12","SK KRETEK 12"];
List newProductList = productList.get();

相关问题