在Flutter中,print()、debugPrint()和log()有什么实际区别?

13 浏览
0 Comments

在Flutter中,print()、debugPrint()和log()有什么实际区别?

我正在尝试创建一个用于日志记录的工具。

我需要了解 print()debugPrint()log() 之间的实际区别。

我看到的许多答案已经过时或令人困惑。而且,一些投票最多的答案是相互矛盾的。

我想要以红色打印错误消息。我正在使用 ANSI 代码来实现。

debugPrint("\x1B[31m HelloDebug \x1B[0m");

以上代码会以红色打印。

但是当我使用 log() 时,它不会以红色打印。它会忽略 ANSI 代码。

我发现一个问题是 log() 有一个 error 参数。

如果我传递错误消息,它会默认处理为红色。

在第一个使用 log 的示例中,红色没有出现,因为 ANSI 代码被忽略了。但是在第一个使用 debugPrint 的示例中,它工作正常。在第三个示例中,它默认为红色错误。但是即使是空字符串消息,都会添加额外的一行。

代码:

enter image description here

输出:

enter image description here

是否可以使用 ANSI 代码 来在日志中使用彩色文本?

因为我还有其他 ANSI 代码用来制作不同颜色的文本。

我不想使用 debugPrint,因为如果我频繁打印某些内容,系统会忽略日志。

经过一段时间的研究,我发现 log 函数是在 dart 运行时的 c++ 中实现的。因为 log 函数是 dart sdk 中的外部函数。

external void log(

String message, {

DateTime? time,

int? sequenceNumber,

int level = 0,

String name = '',

Zone? zone,

Object? error,

StackTrace? stackTrace,

});

https://github.com/dart-lang/sdk/blob/main/runtime/lib/developer.cc

在研究过程中,我还看到了一些不同的答案。

下面的答案说 debugPrint 只能在 widget 类内部使用。这个说法仍然正确吗?

https://stackoverflow.com/a/52241553/9248098

编辑:

在使用 debugPrint 并从 Android Studio 终端启动应用程序时,ANSI 颜色在 Android 上起作用,但在 iOS 上运行时,它会在相同的 Android Studio 终端中转义字符。

如果 ANSI 代码的支持基于终端的支持,我无法弄清楚为什么在 iOS 的相同终端中会有问题。

0
0 Comments

在Flutter中,print()、debugPrint()和log()都可以用于在控制台输出日志信息。然而,它们之间存在一些实际的区别。

首先,debugPrint()类似于print(),但是会应用节流机制,以防止被Android内核丢弃。为了避免在生产代码中使用print(),如果你在VSCode或其他IDE上设置了linter,你会看到一个警告。可以参考Avoid print calls in production code获取更多信息。

为了避免linter错误,可以使用kDebugMode与print()或debugPrint()一起使用,例如:

if (kDebugMode) {

print('test print');

}

// 或者

debugPrint('test debugPrint');

接下来,log()函数允许你在日志输出中包含更多的信息。例如,你可以添加runtimeType和相关的对象,以帮助你调试代码。可以通过以下方式使用log():

log(

'test log',

name: runtimeType.toString(),

error: myObj,

);

另外,你还可以尝试在log()中使用ANSI代码,例如:

log("\x1B[31m HelloDebug \x1B[0m");

然而,这种方法在Android Studio中可能不起作用,可能是因为Android Studio对ANSI代码的支持不够完善。

如果想在release模式下避免debugPrint()输出日志,可以参考stackoverflow上的回答,在代码中覆盖debugPrint()函数来实现,具体可以参考stackoverflow.com/a/74936653/9248098。

print()、debugPrint()和log()在Flutter中都可以用于输出日志信息,但它们之间存在一些实际的区别和用法。

0