需求:需要记录历史数据,于是在操作之前需要将List数组对象深拷贝一份在一个新的数组对象里。
1:封装了一个复杂对象
import 'package:flutter/material.dart';
import '../../data/enums/direction_enum.dart';
import 'b.dart';
class A{
A({
this.id,
this.name,
this.listB,
this.offset = Offset.zero,
this.size = Size.zero,
this.onSelect = false,
this.direct = DirectEnum.normal,
});
int? id;
String? name;
List<B>? listB;
late Offset offset;
late Size size;
late DirectEnum direct;
late bool onSelect;
A.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
if (json['listB'] != null) {
listB = [];
json['listB'].forEach((v) {
listB!.add(B.fromJson(v));
});
}
offset = Offset(json['offset'].first, json['offset'].last);
size = Size(json['size'].first, json['size'].last);
direct = DirectionParsing.fromString(json['direct']);
onSelect = json['onSelect'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = {};
data['id'] = id;
data['name'] = name;
if (listB != null) {
data['listB'] = listB!.map((v) => v.toJson()).toList();
}
data['offset'] = [offset.dx, offset.dy];
data['size'] = [size.width, size.height];
data['direct'] = direct.value();
data['onSelect'] = onSelect;
return data;
}
}
class B {
B({
this.id,
this.name,
});
int? id;
String? name;
B.fromJson(Map<String, dynamic> json) {
id = json['id'];
name = json['name'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = {};
data['id'] = id;
data['name'] = name;
return data;
}
}
enum DirectEnum {
left,
top,
right,
bottom,
normal;
}
extension DirectionParsing on DirectEnum {
String value() {
return toString().split('.').last;
}
static DirectEnum fromString(String type) {
return DirectEnum.values.firstWhere((e) => e.value() == type);
}
}
2:创建泛型为A对象的数组
// 里面自行添加数据,演示就不添加了
List<A> listA=[...];
3:现在需要将listA这个数组深拷贝一份,使用下面操作
List<A> listA=[...];
List<A> cloneA = [];
void cloneData() {
cloneA = [];
for (var v in listA) {
Map<String, dynamic> data = jsonDecode(jsonEncode(v.toJson()));
cloneA.add(A.fromJson(data));
}
这样listA中的数据就完全的深拷贝了一份在cloneA这个数组里面了。
结尾:
对于不是复杂的对象数组,可以尝试使用 List.from() 或 sublist(0) 来进行处理。
对于复杂的结构体可以借鉴上面的案例~