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!
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.
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);
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 .
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);
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;
}
Essayer d'utiliser une interface copiable fournie par Dart.
[ https://pub.dev/documentation/copyable/latest/index.html#usage] [1]
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())
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);
}
Et l'opérateur de propagation?
var a = MyClass();
var b = [...[a]][0]; // copy of a