web-dev-qa-db-fra.com

Comment puis-je cloner un objet (copie complète) dans Dart?

Existe-t-il un moyen pris en charge par le langage de faire une copie complète (en profondeur) d'un objet dans Dart?

Secondaire seulement; y a-t-il plusieurs façons de procéder et quelles sont les différences?

Merci pour la clarification!

36
george koller

Non, pour autant que les questions ouvertes semblent suggérer:

http://code.google.com/p/Dart/issues/detail?id=3367

Et plus précisément:

.. Objects have identity, and you can only pass around references to them. There is no implicit copying.
18
JAR.JAR.beans

Les collections intégrées de fléchettes utilisent un constructeur nommé appelé "from" pour accomplir cela. Voir cet article: Cloner une liste, une carte ou un ensemble dans Dart

Map mapA = {
    'foo': 'bar'
};
Map mapB = new Map.from(mapA);
16
computmaxer

Je suppose que pour les objets pas trop complexes, vous pouvez utiliser la bibliothèque de conversion:

import 'Dart:convert';

puis utiliser la fonctionnalité de codage/décodage JSON

Map clonedObject = JSON.decode(JSON.encode(object));

Si vous utilisez une classe personnalisée en tant que valeur dans l'objet à cloner, la classe doit implémenter une méthode toJson () ou vous devez fournir une fonction toEncodable pour la méthode JSON.encode et une méthode reviver pour l'appel de décodage .

8
Lukas B.

Tard dans la fête, mais j'ai récemment fait face à ce problème et j'ai dû faire quelque chose comme: -

class RandomObject {

RandomObject(this.x, this.y);

RandomObject.clone(RandomObject randomObject): this(randomObject.x, randomObject.y);

int x;
int y;
}

Ensuite, vous pouvez simplement appeler la copie avec l'original, comme ceci: -

final RandomObject original = RandomObject(1, 2);
final RandomObject copy = RandomObject.clone(original);
5
Phill Wiggins

Disons que vous avez une classe

Class DailyInfo

  { 
     String xxx;
  }

Créer un nouveau clone de l'objet de classe dailyInfo par

 DailyInfo newDailyInfo =  new DailyInfo.fromJson(dailyInfo.toJson());

Pour que cela fonctionne, votre classe doit avoir implémenté

 factory DailyInfo.fromJson(Map<String, dynamic> json) => _$DailyInfoFromJson(json);


Map<String, dynamic> toJson() => _$DailyInfoToJson(this);

ce qui peut être fait en rendant la classe sérialisable en utilisant

@JsonSerializable(fieldRename: FieldRename.snake, includeIfNull: false)
Class DailyInfo{ 
 String xxx;
}
3
Gauranga

Essayer d'utiliser une interface copiable fournie par Dart.

[ https://pub.dev/documentation/copyable/latest/index.html#usage] [1]

2
Aayush Goyal

Passage des objets du modèle par valeur:

S'il s'agit d'un type d'entité et qu'il a implémenté des fonctions fromMap(), toMap(), cela peut aider, en vous donnant un client nouvellement créé.

Customer.fromMap(customerObject.toMap())
1
Baig

Malheureusement, aucune prise en charge linguistique. J'ai créé une classe abstraite appelée copyable que je peux implémenter dans les classes que je veux pouvoir copier:

abstract class Copyable<T> {
  T copy();
  T copyWith();
}

Je peux ensuite l'utiliser comme suit, par exemple pour un objet Location:

@override
Location copy() {
  return Location(
      longitude: this.longitude,
      latitude: this.latitude,
      timestamp: this.timestamp,
      country: this.country,
      locality: this.locality,
      postalCode: this.postalCode,
      name: this.name,
      isoCountryCode: this.isoCountryCode,
      bearing: this.bearing);
}

@override
Location copyWith({
    String country,
    String locality,
    String name
  }) {
  return Location(
      country: country,
      locality: locality,
      name: name,
      longitude: this.longitude,
      latitude: this.latitude,
      timestamp: this.timestamp,
      postalCode: this.postalCode,
      isoCountryCode: this.isoCountryCode,
      bearing: this.bearing);
}
0
luckyhandler

Et l'opérateur de propagation?

var a = MyClass();
var b = [...[a]][0]; // copy of a
0
Fehim