如何使用Dart语言将变量完全转储/打印到控制台?

时间:2017-02-24 13:38:36

标签: debugging dart

嘿我在那里正在搜索一个函数,该函数尽可能完全地以Dart语言向控制台打印动态变量。

例如,在 PHP 中,我会使用var_dump()来获取有关变量的所有信息。

JavaScript 中,我会执行以下操作之一:

1)将Object转换为JSON并打印console.log(JSON.stringify(obj))

2)或者像这样的自定义函数:

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

然而,在 Dart 中如果我print(variable),我会得到类似Instance of 'FooBarObject'的内容。我不能像JavaScript一样将对象转换为JSON,因为这对所有对象都不可能。

所以我的问题详细说明:

  

dart中的函数或自定义函数是否可以打印包含所有(公共)属性以及嵌套对象和变量的未知类型(对象,数组等)的变量到我的控制台?或者哪种功能最接近这种愿望?

8 个答案:

答案 0 :(得分:8)

如果是地图,则可以转换为StringIfNotFormattableStringAdapter。首先从flutter导入JSON包。

convert

然后转换为import 'dart:convert'; 并打印

JSON

答案 1 :(得分:6)

没有内置函数可以生成这样的输出。

print(variable)打印variable.toString()Instance of 'FooBarObject'是默认实现。您可以在自定义类中覆盖它并打印不同的内容。

您可以使用反射(https://www.dartlang.org/articles/libraries/reflection-with-mirrors)自行构建一个函数,该函数调查实例的各种属性并以您希望的方式打印它。 几乎没有限制你可以做什么,为了调试目的,它绝对是一个很好的选择。

对于生产Web应用程序,应该避免它,因为它严重限制了树木抖动,并且会导致构建输出大小显着增加。 颤动(移动)根本不支持反射。

您还可以使用其中一个JSON序列化包,这样可以轻松地将序列化添加到自定义类,然后打印序列化值。 例如

我认为还有其他人,但我不了解(dis)优势,因为我通常会使用https://pub.dartlang.org/packages/source_gen

答案 2 :(得分:4)

dart:developer library具有inspect function,它允许调试器打开对象上的检查器。

要使用它,请添加:

import 'dart:developer';

然后您可以在控制台中通过以下命令查看检查的变量/对象:

inspect(myVar);

答案 3 :(得分:1)

Instance of 'FooBarObject'当您尝试直接执行print(object);

时会发生这种情况

即使您从抖动中使用convert包,它也会抛出Uncaught Error: Converting object to an encodable object failed:

要解决此问题,首先,请确保您的模型类或数据类包含fromJsontoJson方法。

如果这样做,您的模型类将如下所示。

class User {
  String name;
  String gender;
  int age;

  User({this.name, this.gender, this.age});

  User.fromJson(Map<String, dynamic> json) {
    name = json['name'];
    gender = json['gender'];
    age = json['age'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['name'] = this.name;
    data['gender'] = this.gender;
    data['age'] = this.age;
    return data;
  }
}

并将其打印为json导入convert

import 'dart:convert';

并致电json.encode

//after initializing the user object
 print('value is--> ' + json.encode(user);

将数据打印为

value is--> {"name": "Vignesh","gender": "Male","age": 25}

答案 4 :(得分:1)

简单的小技巧就能完成工作

void printObject(Object object) {
  // Encode your object and then decode your object to Map variable
  Map jsonMapped = json.decode(json.encode(object)); 

  // Using JsonEncoder for spacing
  JsonEncoder encoder = new JsonEncoder.withIndent('  '); 

  // encode it to string
  String prettyPrint = encoder.convert(jsonMapped); 

  // print or debugPrint your object
  debugPrint(prettyPrint); 
}

// To use simply pass your object to it
printObject(yourObject); 

答案 5 :(得分:0)

将await关键字与异步函数中的对象一起使用 void _registerUser() async { print(await form.result); }

答案 6 :(得分:0)

如果您想了解有关android studio中任何类的实例的更多信息,请在变量前单击类名,然后按ctrl + b,它将带您到该对象所属的类文件,您可以看到用户属性和此类的方法。

enter image description here

答案 7 :(得分:-2)

尝试一下。

  void printWrapped(String text) {
    final pattern = new RegExp('.{1,800}'); // 800 is the size of each chunk
    pattern.allMatches(text).forEach((match) => print(match.group(0)));
  }