web-dev-qa-db-fra.com

Comment vider / imprimer complètement une variable sur la console en langage Dart?

Hé là je cherche une fonction qui imprime une variable dynamique aussi complètement que possible sur la console en langage Dart.

Dans PHP par exemple j'utiliserais var_dump() afin d'obtenir toutes les informations sur une variable.

Dans JavaScript je ferais l'une des choses suivantes:

1) Convertir un objet en JSON et imprimer console.log (JSON.stringify (obj))

2) Ou une fonction personnalisée comme celle-ci:

 function dump(arr,level) {
  var dumped_text = "";
  if(!level) level = 0;

  //The padding given at the beginning of the line.
  var level_padding = "";
  for(var j=0;j<level+1;j++) level_padding += "    ";

  if(typeof(arr) == 'object') { //Array/Hashes/Objects 
   for(var item in arr) {
    var value = arr[item];

    if(typeof(value) == 'object') { //If it is an array,
     dumped_text += level_padding + "'" + item + "' ...\n";
     dumped_text += dump(value,level+1);
    } else {
     dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
    }
   }
  } else { //Stings/Chars/Numbers etc.
   dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
  }
  return dumped_text;
 }

Cependant dans Dart si je fais print(variable) j'obtiens quelque chose comme Instance of 'FooBarObject'. Je ne peux pas simplement convertir un objet en JSON comme en JavaScript car cela n'est pas possible pour tous les objets.

Donc ma question en détail:

Y a-t-il une fonction ou une fonction personnalisée dans Dart qui peut imprimer une variable de type inconnu (objet, tableau, etc.), y compris toutes les propriétés (publiques) ainsi que les objets et variables imbriqués sur ma console? Ou quelle fonction est la plus proche de ce désir?

12
Blackbam

Il n'y a pas de fonction intégrée qui génère une telle sortie.

print(variable) imprime variable.toString() et Instance of 'FooBarObject' est l'implémentation par défaut. Vous pouvez le remplacer dans des classes personnalisées et imprimer quelque chose de différent.

Vous pouvez utiliser la réflexion ( https://www.dartlang.org/articles/libraries/reflection-with-mirrors ) pour créer vous-même une fonction qui examine toutes sortes de propriétés d'une instance et l'imprime comme vous voulez. Il n'y a presque aucune limite à ce que vous pouvez faire et à des fins de débogage, c'est certainement une bonne option.

Pour les applications Web de production, cela doit être évité car il limite sérieusement les tremblements d'arbre et entraînera une augmentation notable de la taille de sortie de la génération. Flutter (mobile) ne supporte pas du tout la réflexion.

Vous pouvez également utiliser l'un des packages de sérialisation JSON, qui facilitent l'ajout de la sérialisation aux classes personnalisées, puis impriment la valeur sérialisée. Par exemple

Je pense qu'il y en a d'autres, mais je ne connais pas les (dés) avantages, car j'ai l'habitude de rouler le mien en utilisant https://pub.dartlang.org/packages/source_gen

11
Günter Zöchbauer