151 votes

Comment cloner un objet (copie profonde) dans Dart ?

Existe-t-il un moyen, supporté par le langage, de faire une copie complète (profonde) d'un objet dans Dart ?

Secondaire uniquement ; existe-t-il plusieurs façons de procéder, et quelles sont les différences ?

Merci pour la clarification !

60voto

computmaxer Points 1403

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

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

60voto

Phill Wiggins Points 572

J'interviens tardivement, mais j'ai récemment été confronté à ce problème et j'ai dû faire quelque chose du type :-.

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);

54voto

JAR.JAR.beans Points 2142

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

https://github.com/dart-lang/sdk/issues/3367

Et plus précisément :

... Les objets ont une identité, et vous pouvez seulement transmettre des références à eux. Il n'y a pas de copie implicite.

26voto

Lukas B. Points 231

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

import 'dart:convert';

et ensuite utiliser la fonctionnalité d'encodage/décodage JSON

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

Si vous utilisez une classe personnalisée comme valeur dans l'objet à cloner, la classe doit soit implémenter une méthode toJson(), soit fournir une fonction toEncodable pour la méthode JSON.encode et une méthode reviver pour l'appel decode.

15voto

Andev Points 11

Malheureusement, il n'y a pas de support linguistique. Ce que j'ai fait, c'est créer 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 :

class Location implements Copyable<Location> {
  Location({
    required this.longitude,
    required this.latitude,
    required this.timestamp,
  });

  final double longitude;
  final double latitude;
  final DateTime timestamp;

  @override
  Location copy() => Location(
        longitude: longitude,
        latitude: latitude,
        timestamp: timestamp,
      );

  @override
  Location copyWith({
    double? longitude,
    double? latitude,
    DateTime? timestamp,
  }) =>
      Location(
        longitude: longitude ?? this.longitude,
        latitude: latitude ?? this.latitude,
        timestamp: timestamp ?? this.timestamp,
      );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X