路由管理学习笔记
路由(Route)在移动开发中通常指页面(Activity)
Navigator.push(context,new MaterialPageRoute(
builder:(context){
return NewRute1();
}
));
MaterialPageRoute继承自PageRoute类
MaterialPageRoute({
//builder 是一个WidgetBuilder类型的回调函数,它的作用是构建路由页面的具体内容,返回值是一个widget。我们通常要实现此回调,返回新路由的实例。
WidgetBuilder builder,
//settings 包含路由的配置信息,如路由名称、是否初始路由(首页)。
RouteSettings settings,
//maintainState:默认情况下,当入栈一个新路由时,原来的路由仍然会被保存在内存中,如果想在路由没用的
//时候释放其所占用的所有资源,可以设置maintainState为false。
bool maintainState = true,
//fullscreenDialog表示新的路由页面是否是一个全屏的模态对话框,
bool fullscreenDialog = false,
})
如果想自定义路由切换动画,可以自己继承PageRoute来实现,我们将在后面介绍动画时,实现一个自定义的路由Widget。
Navigator
Navigator是一个路由管理的widget
Future push(BuildContext context, Route route)
将给定的路由入栈(即打开新的页面),返回值是一个Future对象,用以接收新路由出栈(即关闭)时的返回数据。
bool pop(BuildContext context, [ result ])
将栈顶路由出栈,result为页面关闭时返回给上一个页面的数据
注册路由表
return new MaterialApp(
title: 'Flutter Demo',
theme: new ThemeData(
primarySwatch: Colors.blue,
),
//注册路由表
routes:{
"new_page":(context)=>NewRoute(),
} ,
home: new MyHomePage(title: 'Flutter Demo Home Page'),
);
通过路由名打开新路由页
Navigator.pushNamed(context, "new_page");
命名路由参数
打开路由时传递参数
Navigator.of(context).pushNamed("new_page", arguments: "hi");
在路由页通过RouteSetting对象获取路由参数:
class EchoRoute extends StatelessWidget {
@override
Widget build(BuildContext context) {
//获取路由参数
var args=ModalRoute.of(context).settings.arguments
//...省略无关代码
}
}
包管理
Android使用Gradle来管理依赖,Flutter用pubspec.yaml(位于项目根目录)来管理第三方依赖包
pubspec.yaml的简单示例
#应用或包名称
name: flutter_in_action
#应用或包的描述、简介
description: First Flutter application.
#应用或包的版本号
version: 1.0.0+1
#应用或包依赖的其它包或插件
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
#开发环境依赖的工具包(而不是flutter应用本身依赖的包
dev_dependencies:
flutter_test:
sdk: flutter
#flutter相关的配置选项
flutter:
uses-material-design: true
依赖本地包
dependencies:
pkg1:
path: ../../code/pkg1
依赖Git
dependencies:
pkg1:
git:
url: git://github.com/xxx/pkg1.git
上面假定包位于Git存储库的根目录中。如果不是这种情况,可以使用path参数指定相对位置
dependencies:
package1:
git:
url: git://github.com/flutter/packages.git
path: packages/package1
资源管理
assets是会打包到程序安装包中的,可在运行时访问。常见类型的assets包括静态数据(例如JSON文件)、配置文件、图标和图片(JPEG,WebP,GIF,动画WebP / GIF,PNG,BMP和WBMP)等。
指定 assets
和包管理一样,Flutter也使用pubspec.yaml文件来管理应用程序所需的资源
flutter:
assets:
- assets/my_icon.png
- assets/background.png
class NewRute1 extends StatelessWidget {
@override
Widget build(BuildContext context) {
// TODO: implement build
return Scaffold(
appBar: AppBar(
title: Text("New route"),
),
body: Center(
child: Image.asset('graphics/icon_tj70_zbb@3x.png')
),
);
}
}
Dart线程模型
Dart 在单线程中是以消息循环机制来运行的,其中包含两个任务队列,一个是“微任务队列” microtask queue,一个是“事件队列” event queue,微任务队列的执行优先级高于事件队列。
Flutter异常捕获
Dart中可以通过try/catch/finally来捕获代码块异常
Flutter框架异常捕获
Flutter 框架为我们在很多关键的方法进行了异常捕获
//当我们布局发生越界或不合规范时,Flutter就会自动弹出一个错误界面,这是因为Flutter已经在执行build方法时添加了异常捕获
@override
void performRebuild() {
...
try {
//执行build方法
built = build();
} catch (e, stack) {
// 有异常时则弹出错误提示
built = ErrorWidget.builder(_debugReportException('building $this', e, stack));
}
...
}
https://book.flutterchina.club/chapter2/thread_model_and_error_report.html