从 Flutter 记录大字符串
Posted
技术标签:
【中文标题】从 Flutter 记录大字符串【英文标题】:Logging large strings from Flutter 【发布时间】:2018-08-14 18:59:20 【问题描述】:我正在尝试构建一个 Flutter 应用程序并在此过程中学习 Dart,但在调试时我有点沮丧。我从 API 中获取了一个资源,现在我想将 JSON 字符串打印到控制台,但它一直在切断字符串。
所以我实际上有两个问题:终端控制台真的是打印调试消息的唯一方法吗?如何在控制台打印大字符串而不自动切断它们?
【问题讨论】:
为什么不直接使用断点呢? 你试过flutter logs
或adb logcat
是否提供完整输出?
断点是一个很好的建议,但是,在不暂停我的应用程序的情况下将整个响应 JSON 字符串打印到控制台应该不是不可能的吗?断点很棒,但并不总是你想要的......
flutter logs
显示相同,这实际上是屏幕截图的来源。
【参考方案1】:
如何使用来自dart: developer
库的 Flutter 日志。这似乎没有像print()
或debugPrint()
这样的最大长度限制。这是唯一似乎可以正常工作的解决方案。尝试如下:
log(reallyReallyLongText)
输出将是整个长字符串,没有中断,并以[log]
为前缀
【讨论】:
我做错了什么? var data = 'recordType':recordTypeText, 'horseId': horseId, 'dateOfCheck': dateOfCheck, 'title': 标题, 'details': details, 'images':images ;日志(data.toString());并且没有输出 对我仍然不起作用 @user1634451 它的输出级别不同,您可能在终端上看不到它,但它适用于 vscode 它有效!!!.. 任何导入开发人员导入的问题?【参考方案2】:您可以制作自己的印刷品。定义这个方法
void printWrapped(String text)
final pattern = RegExp('.1,800'); // 800 is the size of each chunk
pattern.allMatches(text).forEach((match) => print(match.group(0)));
像这样使用它
printWrapped("Your very long string ...");
Credit
【讨论】:
【参考方案3】:目前 dart 不支持打印超过 1020 个字符的日志(通过尝试发现)。
所以,我想出了这个打印长日志的方法:
static void LogPrint(Object object) async
int defaultPrintLength = 1020;
if (object == null || object.toString().length <= defaultPrintLength)
print(object);
else
String log = object.toString();
int start = 0;
int endIndex = defaultPrintLength;
int logLength = log.length;
int tmpLogLength = log.length;
while (endIndex < logLength)
print(log.substring(start, endIndex));
endIndex += defaultPrintLength;
start += defaultPrintLength;
tmpLogLength -= defaultPrintLength;
if (tmpLogLength > 0)
print(log.substring(start, logLength));
【讨论】:
【参考方案4】:使用带有可选参数的debugPrint根据平台的输出限制进行换行。
debugPrint(someSuperLongString, wrapWidth: 1024);
【讨论】:
它打印所有内容,但结果再次被截断......【参考方案5】:如果您想阅读,请尝试debugPrint('your output');
而不是print('your output');
文档是here。 debugPrint
根据文档将输出限制在一定水平,以避免被 android 内核丢弃。
【讨论】:
我也读到了,我确实尝试了debugPrint
,但无济于事。我现在也在 iPhone 模拟器上运行我的应用程序,并且在为 ios 开发时没有任何关于日志被切断的情况。
嗯,谢谢你让我知道这件事。我将再次尝试检查并在 iosSimulator 上运行它。
debugPrint() 也会为我截断长字符串。限制似乎是 700 个字符。
是的,我仍然使用 debugprint 被截断
只需要添加wrapWidth: <SomeBigInt>
调用debugPrint就不会截断了【参考方案6】:
有一个未解决的问题:https://github.com/flutter/flutter/issues/22665
debugPrint 和 print 实际上是在截断输出。
【讨论】:
【参考方案7】:您可以使用Logger Plugin:https://pub.dev/packages/logger 实现此目的
要打印任何类型的日志,只需执行以下操作。
var logger = Logger();
logger.d("Logger is working!");// It also accept json objects
事实上,它甚至会为你格式化输出。
【讨论】:
它仍然不适合我:/【参考方案8】:使用这个方法
JsonEncoder encoder = new JsonEncoder.withIndent(' ');
String prettyprint = encoder.convert(yourJsonString);
debugPrint(prettyprint);
但它只适用于 JSON 字符串,我不知道如何处理“普通”字符串。 我认为的第一件事是在每 n 个字符之后手动添加一个 \n,目前,等待稳定的修复!
【讨论】:
【参考方案9】:如果您在 android studio 中运行应用程序,它将截断长字符串。
在我使用长字符串的 xcode 10.2 中没有截断。
我的建议是编写打印语句日志并在 Xcode 而不是 android studio 中运行应用程序。
【讨论】:
【参考方案10】:这是一个基于@CopsOnRoad的answer的单行代码,您可以快速复制和粘贴(例如:当您想稍微修改代码并记录一些数据并临时查看时):
void printWrapped(String text) => RegExp('.1,800').allMatches(text).map((m) => m.group(0)).forEach(print);
【讨论】:
【参考方案11】:print(''' $longObject ''');
使用这种方式,我们可以打印长数据或对象
【讨论】:
以上是关于从 Flutter 记录大字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何创建一个 Flutter Futurebuilder 函数来显示从 JSON 中获取的字符串数组?