嘿我在那里正在搜索一个函数,该函数尽可能完全地以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中的函数或自定义函数是否可以打印包含所有(公共)属性以及嵌套对象和变量的未知类型(对象,数组等)的变量到我的控制台?或者哪种功能最接近这种愿望?
答案 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:
要解决此问题,首先,请确保您的模型类或数据类包含fromJson
和toJson
方法。
如果这样做,您的模型类将如下所示。
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)
答案 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)));
}