Flutter List深拷贝

需求:需要记录历史数据,于是在操作之前需要将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) 来进行处理。
对于复杂的结构体可以借鉴上面的案例~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值