如果您一次输出太多,Android 有时可能会丢失一些日志行。可以使用 Flutter 的 foundation
包中的 debugPrint()
方法来避免这个问题。它封装了 print
方法,通过控制输出的等级,从而避免输出内容被 Android 的内核丢弃。
为了便于跟踪和记录应用的运行情况,我们在开发时通常会在一些关键步骤输出日志(Log),在Flutter中我们使用 print 函数在控制台打印出相关的上下文信息。通过这些信息,就可以定位代码中可能出现的问题。不过,由于涉及 I/O 操作,使用 print 来打印信息会消耗较多的系统资源。同时,这些输出数据很可能会暴露 App 的执行细节,所以我们在发布正式版时还需要屏蔽掉这些输出。
不过最工程化的做法是读取项目配置文件,根据运行环境来开启日志调试功能。为了根据不同的运行环境来开启日志调试功能,我们可以使用 Flutter 提供的debugPrint 来代替 print。debugPrint 函数同样会将消息打印至控制台,但与 print 不同的是,它提供了定制打印的能力。也就是说,我们可以向 debugPrint 函数,赋值一个函数声明来自定义打印行为。
比如在下面的代码中,我们将 debugPrint 函数定义为一个空函数体,这样就可以实现一键取消打印的功能了。
debugPrint = (String message, {int wrapWidth}) {};//空实现
在 Flutter 中,我们可以使用不同的 main 文件来表示不同环境下的入口。同样,在Flutter开发中,可以通过 main.dart 与 main-dev.dart,去分别定义生产环境与开发环境不同的打印日志行为。
在下面的例子中,我们将生产环境的 debugPrint 定义为空实现,将开发环境的 debugPrint 定义为同步打印数据,如下所示。
//main.dart void main() { // 将debugPrint指定为空的执行体, 所以它什么也不做 debugPrint = (String message, {int wrapWidth}) {}; runApp(MyApp()); } //main-dev.dart void main() async { // 将debugPrint指定为同步打印数据 debugPrint = (String message, {int wrapWidth}) => debugPrintSynchronously(message, wrapWidth: wrapWidth); runApp(MyApp()); }
可以看到,在代码实现上,我们只要将应用内所有的 print 都替换成 debugPrint,就可以满足开发环境下打日志的需求,也可以保证生产环境下应用的执行信息不会被意外打印。