一、前言
Flutter 支持 3 种运行模式,包括 Debug、Release 和Profile,我们在开发中希望debug模式下展示尽可能多的信息给我们,方便排查问题等,但是在release模式下编译的目的是最终的线上版本,给客户使用,这些信息是不需要展示的,这个时候对我们最重要的是代码尽可能快、稳定的运行,所以在release模式下我们会选择关闭打印信息等。
二、运行模式
Flutter 支持 3 种运行模式,包括 Debug、Release 和Profile,我们一般使用的是Debug和Release
- Debug模式对应Dart的JIT模式,该模式会打开所有的断言(assert),调试信息等,并支持Hot reload(热重载),但是并没有优化代码执行速度、二进制包大小和部署,所以在debug模式下我们会感觉到卡顿,不流畅等问题
- Release模式对应Dart的AOT模式,该模式会关闭所有断言,尽可能多的调试信息。此外还优化了应用快速启动,代码快速执行,以及二进制包的大小,所以在release模式下,才是Flutter真正的实力,非常流畅。
三、运行模式区分
- 1、通过断言识别
- 2、通过编译常数识别
第一种、通过断言识别
根据模式的介绍,可以知道Release模式关闭了所有的断言,因此我们可以借助断言,写出只在Debug模式下生效的代码
assert((){
// Do something for debug
print('这是asset下的输出内容');
return true;
}());
需要注意的是,匿名函数声明调用结束时追加了小括号(),这是因为断言只能检查布尔值,这里使用括号强制执行这个始终返回true的匿名函数,以保证函数里的代码被执行
第二种、通过编译常数识别
通过断言只能写出debug模式下运行的代码,通过Dart提供的编译常数,我们还可以写出只在Release下执行的代码。Dart提供了一个布尔常量kReleaseMode,可用来判断是否Release模式
import 'package:flutter/foundation.dart';
if (kReleaseMode){ //
//release
}else {
//debug
}
注意,assert的代码在打包时不会打包到二进制包中,而常数识别,debug代码虽然不会执行,但会打进二进制包中,增大包的体积
四、具体使用
- 打印信息(print)的是否打印控制
- 开发环境和生存环境的配置信息自动切换
自由发挥吧。。。
参考链接: