Dart中的数组直接赋值,修改新数组时会导致原数组的内容也一起被修改。
比如:
List list = ['1', '2', '3', '4', '5'];
List copyList = list;
copyList[0] = 'abc';
print(list);
print(copyList);
打印结果如下:
现在把直接赋值改为List.from方法:
List list = ['1', '2', '3', '4', '5'];
List copyList = List.from(list);
copyList[0] = 'abc';
print(list);
print(copyList);
打印结果如下:
如果数组里的元素是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);
打印结果如下:
原数组又被改了,我的解决方法:
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)遍历每一个元素,完成套娃。