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

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

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

【问题讨论】:

  • 为什么不直接使用断点呢?
  • 你试过flutter logsadb logcat是否提供完整输出?
  • 断点是一个很好的建议,但是,在不暂停我的应用程序的情况下将整个响应 JSON 字符串打印到控制台应该不是不可能的吗?断点很棒,但并不总是你想要的......
  • flutter logs 显示相同,这实际上是屏幕截图的来源。

标签: dart flutter


【解决方案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'); 文档是heredebugPrint 根据文档将输出限制在一定水平,以避免被 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 Pluginhttps://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】:

            这是一个基于@CopsOnRoadanswer的单行代码,您可以快速复制和粘贴(例如:当您想稍微修改代码并记录一些数据并临时查看时):

            void printWrapped(String text) => RegExp('.{1,800}').allMatches(text).map((m) => m.group(0)).forEach(print);
            

            【讨论】:

              【解决方案11】:
              print(''' ${longObject} ''');
              

              使用这种方式,我们可以打印长数据或对象

              【讨论】:

                猜你喜欢
                • 2019-02-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-09-20
                • 1970-01-01
                • 1970-01-01
                • 2014-04-19
                相关资源
                最近更新 更多