在 Flutter 的神奇世界中, 有一个非常实用的功能, 即通过 flutter log 命令可以获取真机上日志信息, 而且获取的是所有 flutter 应用的日志, 但这样可能造成自己日志打印的内容被其他人看到. 所以这里介绍一种使用 debugPrint 替换 print 以使发布时的 log 和普通 log 分离的办法.
Flutter log
参考原文详见这个链接, 以下只是简略汇总.
另外这里有一篇比较好的文章介绍如何在 Flutter 中模拟 android 的 flavor 或 iOS 的 scheme.
可以根据当前 APP 执行环境的不同来处理 print. 而方法就是使用 debugPrint 来替换 print 使用. 由于 debugPrint 的功能可以通过向其赋值一个 DebugPrintCallback 来自定义, 故可以像下面这样定义它的功能:
debugPrint = (String message, {int wrapWidth}) {};
而在 flutter 中, 可以使用不同的 main 文件来表示不同环境下的入口. 比如 main.dart 是生产环境的 main. 建立一个 main_dev.dart 实现 debug 环境下的 main. 故两个 main 文件中的 debugPrint 就可以使用不同的实现来达到目的.
(方法是死的人是活的, 也可以将 main.dart 作为开发环境下的 main, 而建立一个 main_publish.dart 作为生产环境下的 main, 打包的时候只需要指定正确的 main 文件即可.)
main.dart:
// 生产环境下的 main 函数 void main() { /// 由于 `DebugPrintCallback` 指定为空的执行体, 故它什么也不做. debugPrint = (String message, {int wrapWidth}) {}; runApp(MyApp()); }
main_dev.dart:
// 有两种 `debugPrint` 实现: `debugPrintThrottled` 和 `debugPrintSynchronously`, 区别详见文档. import 'package:flutter/foundation.dart'; import 'package:package_info/package_info.dart'; void main() async { var packageInfo = await PackageInfo.fromPlatform(); var version = "${packageInfo.packageName} ${packageInfo.version} (${packageInfo.buildNumber})"; debugPrint = (String message, {int wrapWidth}) => debugPrintSynchronouslyWithText(message, version, wrapWidth: wrapWidth); runApp(MyApp()); } void debugPrintSynchronouslyWithText(String message, String version, {int wrapWidth}) { message = "[${DateTime.now()} - $version]: $message"; debugPrintSynchronously(message, wrapWidth: wrapWidth); }
这样就满足了开发环境下的 log 打印需求, 也保证了生产环境下 log 不会被意外打印, 但前提是需要把 APP 里面的 print 都替换为 debugPrint.