8 . 编译模式
根据kReleaseMode这个编译常数可以判断出当前是release环境还是debug环境. 还可以用个断言判断,release编译的时候会将断言全部移除. 通过使用InheritedWidget为应用中可配置部分进行抽象封装(比如接口域名,app名称等),通过配置多入口方式为应用的启动注入配置环境 使用kReleaseMode能判断,但是另一个环境的代码虽然不能执行到,但是会被打入二进制包中.会增大包体积,尽量使用断言.或者打release包的时候把kReleaseMode的另一个逻辑注释掉. if (kReleaseMode) {
//正式环境
text = "release";
} else {
//测试环境 debug
text = "debug";
}
配置一些app的通用配置
///配置抽象
class AppConfig extends InheritedWidget {
//主页标题
final String appName;
//接口域名
final String apiBaseUrl;
AppConfig(
{@required this.appName,
@required this.apiBaseUrl,
@required Widget child})
: super(child: child);
//方便其子Widget在Widget树中找到它
static AppConfig of(BuildContext context) {
return context.inheritFromWidgetOfExactType(AppConfig);
}
//判断是否需要子Widget更新.由于是应用入口,无需更新
@override
bool updateShouldNotify(InheritedWidget oldWidget) {
return false;
}
}
///为不同的环境创建不同的应用入口
//main_dev.dart 这个是正式环境的入口
void main() {
var configuredApp = AppConfig(
appName: 'dev', //主页标题
apiBaseUrl: 'http://dev.example测试数据/', //接口域名
child: MyApp(),
);
runApp(configuredApp);
}
//main.dart 这个是测试环境的入口
/*void main(){
var configuredApp = AppConfig(){
appName: 'example',//主页标题
apiBaseUrl: 'http://api.example测试数据/',//接口域名
child: MyApp(),
}
runApp(configuredApp);
}*/
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
var config = AppConfig.of(context);
return MaterialApp(
title: config.appName,
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
var config = AppConfig.of(context);
return Scaffold(
appBar: AppBar(
title: Text(config.appName),
),
body: Center(
child: Text(config.apiBaseUrl),
),
);
}
}
//运行开发环境应用程序
//flutter run -t lib/main_dev.dart
//运行生产环境应用程序
//flutter run -t lib/main.dart
/*
*
//打包开发环境应用程序
flutter build apk -t lib/main_dev.dart
flutter build ios -t lib/main_dev.dart
//打包生产环境应用程序
flutter build apk -t lib/main.dart
flutter build ios -t lib/main.dart
* */
8 . Hot Reload
Flutter的热重载是基于JIT编译模式的代码增量同步.由于JIT属于动态编译,能够将Dart代码编译成生成中间代码,让Dart VM在运行时解释执行,因此可以通过动态更新中间代码实现增量同步. 热重载流程分为5步: 扫描工程改动 增量编译 推送更新 代码合并 Widget树重建 Flutter接收到代码变更,不会重新启动App,只会触发Widget树的重新绘制.. 「因此可以保持之前的状态」 由于涉及到状态保存与恢复,因此涉及状态兼容和状态初始化的场景,热重载是无法支持的.(比如改动前后Widget状态无法兼容,全局变量与静态属性的更改,main方法里面的更改,initState方法里面更改,枚举和泛型的更改等) 如果遇到了热重载无法支持的场景,可以点击工程面板左下角的热重启(Hot Restart)按钮,也很快9 . 关于调试
debugPrint函数同样会将消息打印至控制台,但与print不同的是,它提供了定制打印的能力.正式环境的时候将debugPrint函数定义为一个空函数体,就可以一键实现取消打印的功能了. // 正式环境 将debugPrint指定为空的执行体, 所以它什么也不做
debugPrint = (String message, {int wrapWidth}) {};
debugPrint('test');
//开发环境就需要打印出日志
debugPrint = (String message, {int wrapWidth}) =>
debugPrintSynchronously(message, wrapWidth: wrapWidth);
开启Debug Painting,有点像原生的绘制布局边界.
void main() {
//Debug Painting 界面调试工具
//有点像原生的显示布局边界
debugPaintSizeEnabled = true;
runApp(MyApp());
}
还可以使用Flutter Inspector去查看更详细的可视化信息.
10 . 常用命令行
阶段 子任务 命令 工程初始化 App工程 flutter create --template=app hello 工程初始化 Dart包工程 flutter create --template=package hello 工程初始化 插件工程 flutter create --template=plugin hello 构建 Debug构建 flutter build apk --debug flutter build ios --debug 构建 Release构建 flutter build apk --release flutter build ios --release 构建 Profile构建 flutter build apk --profile flutter build ios --profile 集成原生工程 独立App打包 flutter build apk --release flutter build ios --release 集成原生工程 Pod/AAR打包 flutter build apk --release flutter build ios --release查看更多关于Flutter 入门笔记(Part 10) 进阶二的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did129218