从 Flutter 记录大字符串

Posted

技术标签:

【中文标题】从 Flutter 记录大字符串【英文标题】:Logging large strings from Flutter 【发布时间】:2018-08-14 18:59:20 【问题描述】:

我正在尝试构建一个 Flutter 应用程序并在此过程中学习 Dart,但在调试时我有点沮丧。我从 API 中获取了一个资源,现在我想将 JSON 字符串打印到控制台,但它一直在切断字符串。

所以我实际上有两个问题:终端控制台真的是打印调试消息的唯一方法吗?如何在控制台打印大字符串而不自动切断它们?

【问题讨论】:

为什么不直接使用断点呢? 你试过flutter logsadb 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: &lt;SomeBigInt&gt;调用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/Dart)

Flutter 中如何从字符串中获取语言代码扑

如何从列表中映射 Flutter JSON 字符串?

如何创建一个 Flutter Futurebuilder 函数来显示从 JSON 中获取的字符串数组?

Flutter 如何使用 JSON 从 Rest API 获取 List<String> _list 数组字符串

Flutter开发中,如何在Visual Studio代码调试控制台打印长字符串?