dart - 如何在 Dart 2 中克隆(复制值)复杂对象

标签 dart

我想使用 Dart 2 克隆一个复杂的对象(复制值),而不是引用。

例子:

class Person {
  String name;
  String surname;
  City city;
}

class City {
  String name;
  String state;
}

main List<String> args {
  City c1 = new City()..name = 'Blum'..state = 'SC';
  Person p1 = new Person()..name = 'John'..surname = 'Xuebl'..city = c1;


  Person p2 = // HERE, to clone/copy values... Something similar to p1.clone();
}

这样做的方法(最佳实践)是什么?

更新说明:How can I clone an Object (deep copy) in Dart?前段时间发的。这里的重点是了解带来许多改进的 Dart 2 是否具有复制复杂对象的功能。

最佳答案

对于您在这里向我们展示的类(class),没有什么比

Person p2 = Person()
  ..name = p1.name
  ..surname = p1.surname
  ..city = (City()..name = p1.city.name..state = p1.city.state);

如果您添加 clone方法 PersonCity ,那么你显然可以使用它。
该语言没有内置任何内容来允许您复制对象的状态。

我建议至少通过添加构造函数来更改类:
class Person {
  String name;
  String surname;
  City city;
  Person(this.name, this.surname, this.city);
}
class City {
  String name;
  String state;
  City(this.name, this.state);
}

然后你可以通过写来克隆:
Person P2 = Person(p1.name, p1.surname, City(p1.city.name, p1.city.state));

(还有 ob-link 关于名字)

我说复制对象没有语言功能,但实际上有,如果您有权访问 dart:isolate库:通过隔离通信端口发送对象。我不建议使用该功能,但为了完整起见,它在这里:
import "dart:isolate";
Future<T> clone<T>(T object) {
  var c = Completer<T>();
  var port = RawReceivePort();
  port.handler = (Object o) {
    port.close();
    c.complete(o);
  }
  return c.future;
}

同样,我不建议使用这种方法。
它适用于像这样的简单对象,但不适用于所有对象(并非所有对象都可以通过通信端口发送,例如,一等函数或任何包含一等函数的对象)。

编写您的类以支持您需要对它们进行的操作,包括复制。

关于dart - 如何在 Dart 2 中克隆(复制值)复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51352622/

相关文章:

flutter - 使用 Provider 时清除 Flutter 中的状态

dart - 更改数据表行和列的颜色

android - Flutter 如何让 uber 或 ola 像在谷歌地图上移动的汽车图标

android - 异步周期性 setState

flutter - 参数类型 'Context' 无法分配给参数类型 'BuildContext' - Flutter

flutter - 如何在flutter中使用CachedNetworkImage处理404异常

flutter - 无法以Flutter/Dart解析文件

flutter - 如何在flutter中比较两个列表数据( Dart )

android - 在 flutter 应用程序中集成 API 会出现错误 "Program linking failed"

mysql - 有没有办法查询一个类是否包含具有某个已知名称的实例变量?