1. State生命周期
- initState()
- 当 widget 第一次插入到 widget 树时会被调用,对于每一个State对象,Flutter 框架只会调用一次该回调。
- 一次性的操作,如状态初始化、订阅子树的事件通知等。
- didChangeDependencies()
- 当State对象的依赖发生变化时会被调用。
- 系统语言 Locale 或应用主题改变时。
- 组件第一次被创建后挂载的时候(包括重创建)对应的didChangeDependencies也会被调用。
- build()
- 在调用initState()之后。
- 在调用didUpdateWidget()之后。
- 在调用setState()之后。
- 在调用didChangeDependencies()之后。
- 在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其它位置之后。
- reassemble()
此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。
- didUpdateWidget()
在 widget 重新构建时,在新旧 widget 的key和runtimeType同时相等时该回调会被调用。
- deactivate()
当 State 对象从树中被移除时,会调用此回调。 如果移除后没有重新插入到树中则紧接着会调用dispose()方法。
- dispose()
当 State 对象从树中被永久移除时调用;通常在此回调中释放资源。
2. 路由管理
管理多个屏幕有两个核心概念和类:Route 和 Navigator。Route是应用程序的“屏幕”或“页面”的抽象(可以认为是Activity), Navigator是管理Route的Widget。Navigator可以通过push和pop route以实现页面切换。
- 打开新的页面
Future push(BuildContext context, Route route)
// 命名路由
Future pushNamed(BuildContext context, String routeName,{Object arguments})
//获取路由参数
var args=ModalRoute.of(context).settings.arguments;
- 关闭页面
bool pop(BuildContext context, [ result ])
// result 为页面关闭时返回给上一个页面的数据
- onGenerateRoute属性
Route<dynamic> Function(RouteSettings settings)
onGenerateRoute 只会对命名路由生效。
调用Navigator.pushNamed(…)打开命名路由时,如果指定的路由名在路由表中已注册,则会调用路由表中的builder函数来生成路由组件;如果路由表中没有注册,才会调用onGenerateRoute来生成路由。
Navigator.push(BuildContext context, Route route)
//等价于
Navigator.of(context).push(Route route)
- 打开新页面并传值
A页面跳转到B页面并传值
var map = {
"storeCode": code,
"storeId": storeId,
"libraryId": libraryId,
};
Navigator.pushNamed(context, "scan_tray", arguments: map);
B页面接收
@override
void initState() {
super.initState();
Future.delayed(Duration.zero, () {
Map<String, dynamic>? args =
ModalRoute.of(context)!.settings.arguments as Map<String, dynamic>?;
});
}
- 返回上一页并传值
B页面返回到A页面并传值
Navigator.pop(context, result);
A页面接收
ElevatedButton(
onPressed: () async {
var result = await Navigator.push(context,
MaterialPageRoute(builder: (context) => B页面()),);
print("返回值为--"+result);
},
child: Text("跳转到B页面")
),