《Flutter实战·第二版》- Preview
1. State生命周期 initState()当 widget 第一次插入到 widget 树时会被调用,对于每一个State对象,Flutter 框架只会调用一次该回调。一次性的 *** 作,如状态初始化、订阅子树的事件通知等。didChangeDependencies()
当State对象的依赖发生变化时会被调用。系统语言 Locale 或应用主题改变时。组件第一次被创建后挂载的时候(包括重创建)对应的didChangeDependencies也会被调用。build()
在调用initState()之后。在调用didUpdateWidget()之后。在调用setState()之后。在调用didChangeDependencies()之后。在State对象从树中一个位置移除后(会调用deactivate)又重新插入到树的其它位置之后。reassemble()
didUpdateWidget()此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。
deactivate()在 widget 重新构建时,在新旧 widget 的key和runtimeType同时相等时该回调会被调用。
dispose()当 State 对象从树中被移除时,会调用此回调。 如果移除后没有重新插入到树中则紧接着会调用dispose()方法。
2. 路由管理当 State 对象从树中被永久移除时调用;通常在此回调中释放资源。
打开新的页面管理多个屏幕有两个核心概念和类: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页面")
),
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)