Flutter List数组深拷贝

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)遍历每一个元素,完成套娃。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容