2
votes

comment créer une copie de List dans Dart lorsque T est un objet voir le code ci-dessous

dans https://dartpad.dartlang.org/ éditeur, j'ai tapé ci-dessous pour tester mon problème.

basé sur mes tests, apparemment la fonction list.from ne crée une NOUVELLE copie que lorsque le T n'est pas objet / classe

J'ai testé list.from pour List cela fonctionne comme un charme mais pas une classe / objet. / p>

s'il vous plaît laissez-moi savoir comment créer une nouvelle copie de la liste de T ci-dessous le code afin que lorsque nous changeons la liste à un endroit, l'autre endroit ne soit pas changé.

Merci

void main() {
  List<Status> statuses = <Status>[
    Status(name: 'Confirmed', isCheck: true),
    Status(name: 'Cancelled', isCheck: true),
  ];
  print('statuses = ${statuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

  //this supposed to create a new list of T but apparently only work for non-object
  List<Status> otherStatuses =  new List<Status>.from(statuses);

  print('otherStatuses= ${otherStatuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

 otherStatuses.singleWhere((x)=>x.name=='Cancelled').isCheck=false;

  print('after the changes only on otherStatuses');
  print('statuses = ${statuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

  print('statuses2 = ${otherStatuses.toList().map((x) => x.name + '=' + x.isCheck.toString())}');

  print('why the original status (cancelled) equal to false?');

}


class Status {
  String name;
  bool isCheck;

  Status({
    this.name,
    this.isCheck,
  });
}


1 commentaires

Vous obtenez une nouvelle copie de la liste , vous n'obtenez pas une nouvelle copie des objets dans la liste. Il n'existe aucun moyen général d'implémenter une copie de collection profonde, vous devez implémenter vous-même la copie des éléments de la liste.


3 Réponses :


5
votes

Pour créer une liste de nouveaux éléments, utilisez la fonction map () que vous avez déjà utilisée à d'autres fins dans votre code:

List<Status> otherStatuses = statuses.map((status)=>Status(name:status.name, isCheck:status.isCheck)).toList()


4 commentaires

Je pense que cette réponse est en quelque sorte une solution de contournement, mais cela fonctionne, que se passe-t-il si le T a autant de propriétés, y a-t-il un meilleur moyen de résoudre cela? car bien sûr, j'ai simplifié les propriétés dans une application réelle est plus complexe que cela.


@Hendra eh bien, je n'utiliserais pas le terme «contournement». J'utiliserais ce terme pour quelque chose qui devrait fonctionner d'une certaine manière, mais ce n'est pas le cas. Ici, vous utilisez la List. from () qui construit une liste à partir des éléments de l'itératrable passés et ces éléments sont passés par référence de sorte qu'ils finissent par être les mêmes objets. Vous devez forger un tout nouvel élément à partir de l'élément passé. Où vous décidez de le faire (dans la fonction de carte, sur une fonction de niveau supérieur ou dans une méthode de clonage d'instance) c'est à vous.


Cela ne marche pas. Il ne devrait pas y avoir de chèque vert.


@EliWhittle pourquoi dites-vous ça? Voici un l'essentiel prouvant que cela fonctionne.



0
votes

Il existe différents fils sur le même sujet trouver solutions multiples. Dans le référentiel de fléchettes , ils ont également discuté d'une fonction de clonage et ont décidé de ne pas l'implémenter et ils ont un problème pour cela.


2 commentaires

Désolé, j'ai peut-être trop modifié, mais votre solution avec nouvelle liste .from (statuts) ne fonctionne toujours pas. Si vous créez des champs finaux, que vous ne pouvez pas les modifier, je pense qu'il me manque quelque chose ...


Vous avez raison, il a besoin de quelques modifications supplémentaires, je les ai ajoutées au message d'origine



0
votes

vous pouvez également utiliser

List<Status> otherStatuses = List<Status>.generate(statuses.length,(i) => Status(name: statuses[i].name , isCheck:statuses[i].isCheck));

concernant POURQUOI?

Votre code n'a pas fonctionné simplement parce que le nouveau otherStatuses code> liste faisait référence au (x) même (s) objet (s) Status . Ainsi, lorsque vous le changiez, il change également dans la liste status d'origine car il s'agit du même objet .


0 commentaires