Flutter

Flutter List数组深拷贝

2020-12-21  本文已影响0人  倪大头

Dart中的数组直接赋值,修改新数组时会导致原数组的内容也一起被修改。
比如:

List list = ['1', '2', '3', '4', '5'];
List copyList = list;
copyList[0] = 'abc';
print(list);
print(copyList);

打印结果如下:


image.png

现在把直接赋值改为List.from方法:

List list = ['1', '2', '3', '4', '5'];
List copyList = List.from(list);
copyList[0] = 'abc';
print(list);
print(copyList);

打印结果如下:


image.png

如果数组里的元素是int或者String,用List.from是没问题的。
现在把原数组的元素换为Map类型:

List list = [{'tag': '1'}, {'tag': '2'}, {'tag': '3'}, {'tag': '4'}, {'tag': '5'}];
List copyList = List.from(list);
copyList[0]['tag'] = 'abc';
print(list);
print(copyList);

打印结果如下:


image.png

原数组又被改了,我的解决方法:

List list = [{'tag': '1'}, {'tag': '2'}, {'tag': '3'}, {'tag': '4'}, {'tag': '5'}];
List copyList = copyWithList(list);
copyList[0]['tag'] = 'abc';
print(list);
print(copyList);

// 数组拷贝
List copyWithList(List list) {
  List copyList = [];
  for (var item in nullToList(list)) {
    if (item is Map) {
      copyList.add(Map.from(item));
    } else if (item is List) {
      copyList.add(copyWithList(item));
    } else {
      copyList.add(item);
    }
  }
  return copyList;
}

遍历原数组,拷贝每一个元素,如果元素是Map类型则使用Map.from(item),List类型则再次调用copyWithList(item)遍历每一个元素,完成套娃。

上一篇 下一篇

猜你喜欢

热点阅读