Dart 中是否有一种方法可以克隆对象?

4

我在Stackoverflow上看了几个有关此问题的问题,但没有一个让我明白。什么是最简单的方法?


1
没有内置的方法来深度复制一个对象。也许有一些包可以使这个过程更容易,但是否则你需要手动创建代码来复制对象(例如,创建一个以对象为参数的复制构造函数,或在对象上创建一个复制方法)。 - julemand101
1
最简单的方法是自己动手做(手工制作)。 - mezoni
copyWith现在是最好的方式(你可以查看Flutter Theme的工作原理)。你可以自己使用copyWith或者使用类似freezed的代码生成器包。 - yellowgray
1个回答

9

请参考以下类:

class Customer {
  final String id;
  final String name;
  final String address;
  final String phoneNo;
  final String gstin;
  final String state;

Customer({
    this.id = '',
    @required this.name,
    @required this.address,
    @required this.phoneNo,
    this.gstin,
    @required this.state,
  });

  Customer copyWith({
    String name,
    String address,
    String phoneNo,
    String gstin,
    String state,
  }) {
    return Customer(
      name: name ?? this.name,
      address: address ?? this.address,
      phoneNo: phoneNo ?? this.phoneNo,
      gstin: gstin ?? this.gstin,
      state: state ?? this.state,
    );
  }

}

使用copyWith构造函数,您可以创建对象的副本。
如果您没有向copyWith构造函数传递任何参数,则它将返回一个具有相同值的新对象。
但是,如果您希望更改任何参数,则可以使用copyWith构造函数,并返回具有您传递的新参数值的对象副本。
注意:在copyWith构造函数中,如果您更改了一个参数值,则其他参数值保持与第一个对象相同。

@YannMassard 你需要深度克隆List、Map中的每个项。然后创建一个包含已克隆项的新List、Map。 - mducc
@Aakash 请更新答案以反映更完整的解决方案:深度克隆列表和映射,如果可能的话,还包括多维映射。 - Xao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接