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

Bla*_*bam 8 debugging dart

嘿那里我正在寻找一个功能,它在Dart语言中尽可能完全地打印动态变量到控制台.

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

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

1)将对象转换为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;
 }
Run Code Online (Sandbox Code Playgroud)

但是如果我在Dart,我会print(variable)得到类似的东西Instance of 'FooBarObject'.我不能像JavaScript一样将对象转换为JSON,因为这对所有对象都不可能.

所以我的问题详细说明:

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

Pau*_*elo 21

dart:developer 库具有检查功能,允许调试器在对象上打开检查器。

要使用它添加:

import 'dart:developer';
Run Code Online (Sandbox Code Playgroud)

您可以在控制台中看到您检查的变量/对象:

inspect(myVar);
Run Code Online (Sandbox Code Playgroud)

  • 对于那些没有看到任何内容的人,请确保您正在使用调试器运行您的应用程序。(在 VSCode 中,运行 &gt; 开始调试)然后可以在调试控制台(而不是终端控制台)中找到转储的对象。 (4认同)
  • 这对我不起作用,它什么也没打印。json方法有效。 (3认同)
  • 这太方便了! (2认同)
  • `print(inspect(myVar))` 对我有用,直到我看到@YEG 的评论。 (2认同)

Saa*_*ran 14

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

import 'dart:convert';
Run Code Online (Sandbox Code Playgroud)

然后转换为JSON并打印

print(json.encode(yourMapVariable));
Run Code Online (Sandbox Code Playgroud)

更新

以上答案适用于map。对于/对象添加到toString()方法。

例如:说我们有一个 user class

class User {
  String name;
  String address;

  toString() {
    return "name: " + name + ", address: " + address;
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以toString()使用您的IDE.

  • 错误`未捕获错误:将对象转换为可编码对象失败:“用户”实例` (4认同)

Gün*_*uer 12

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

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滚动我自己

  • 有很多关于反思的问题和答案。他们中的大多数应该仍然有效。反射并没有太大变化。如果你想在 web 应用程序的生产中使用反射,还有 `reflectable` 包可以将反射代码转换为静态代码,以免影响 tree-shaking。 (2认同)

nic*_*ick 7

简单的小技巧可以完成工作

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); 
Run Code Online (Sandbox Code Playgroud)

  • 必须为该类定义 fromJson() 和 toJson() 才能正常工作。请参阅@VeeyaaR 的回答 (2认同)

小智 5

Instance of 'FooBarObject'当您尝试直接执行时会发生这种情况print(object);

即使你使用convertflutter 中的包,它也会抛出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;
  }
}
Run Code Online (Sandbox Code Playgroud)

并将其打印为json导入convert

import 'dart:convert';
Run Code Online (Sandbox Code Playgroud)

并打电话json.encode

//after initializing the user object
 print('value is--> ' + json.encode(user);
Run Code Online (Sandbox Code Playgroud)

这会将数据打印为

value is--> {"name": "Vignesh","gender": "Male","age": 25}
Run Code Online (Sandbox Code Playgroud)