博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flutter 全局监听路由堆栈变化
阅读量:4082 次
发布时间:2019-05-25

本文共 4188 字,大约阅读时间需要 13 分钟。

监听路由堆栈的变化使用 RouteObserver ,首先在 MaterialApp 组件中添加 navigatorObservers

void main() {  runApp(MyApp());}RouteObserver
routeObserver = RouteObserver
();class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( ... navigatorObservers: [routeObserver], home: HomePage(), ); }}

监听页面设置如下:

class ARouteObserverDemo extends StatefulWidget {  @override  _RouteObserverDemoState createState() => _RouteObserverDemoState();}class _RouteObserverDemoState extends State
with RouteAware { @override void didChangeDependencies() { super.didChangeDependencies(); routeObserver.subscribe(this, ModalRoute.of(context)); } @override Widget build(BuildContext context) { return Scaffold( body: Container( alignment: Alignment.center, child: RaisedButton( child: Text('A RouteObserver'), onPressed: () { Navigator.of(context).pushNamed('/BRouteObserver'); }, ), ), ); } @override void dispose() { super.dispose(); routeObserver.unsubscribe(this); } @override void didPush() { final route = ModalRoute.of(context).settings.name; print('A-didPush route: $route'); } @override void didPopNext() { final route = ModalRoute.of(context).settings.name; print('A-didPopNext route: $route'); } @override void didPushNext() { final route = ModalRoute.of(context).settings.name; print('A-didPushNext route: $route'); } @override void didPop() { final route = ModalRoute.of(context).settings.name; print('A-didPop route: $route'); }}

其中 didPush、didPushNext、didPopNext、didPop 为路由堆栈变化的回调。

从 A 页面跳转到 ARouteObserverDemo 页面,日志输出如下:

flutter: A-didPush route: /ARouteObserver

进入此页面只调用了 didPush。

从 ARouteObserverDemo 页面跳转到 BRouteObserverDemo 页面(同 ARouteObserverDemo 页面,设置了监听),日志输出如下:

flutter: A-didPushNext route: /ARouteObserverflutter: B-didPush route: /BRouteObserver

先调用了 ARouteObserverDemo 页面的 didPushNext,然后调用了 BRouteObserverDemo 页面的 didPush。

从 BRouteObserverDemo 页面执行 pop 返回 ARouteObserverDemo 页面,日志输出如下:

flutter: A-didPopNext route: /ARouteObserverflutter: B-didPop route: /BRouteObserver

先调用了 ARouteObserverDemo 页面的 didPopNext,然后调用了 BRouteObserverDemo 页面的 didPop。

上面的案例仅仅是页面级别的路由堆栈变化,如果想知道整个应用程序路由堆栈变化如何处理?

一种方法是写一个监听路由堆栈的基类,所有页面继承此基类。此方法对源代码的侵入性非常高。

还有一种方法是自定义 RouteObserver,继承RouteObserver并重写其中的方法:

class MyRouteObserver
> extends RouteObserver
{ @override void didPush(Route route, Route previousRoute) { super.didPush(route, previousRoute); print('didPush route: $route,previousRoute:$previousRoute'); } @override void didPop(Route route, Route previousRoute) { super.didPop(route, previousRoute); print('didPop route: $route,previousRoute:$previousRoute'); } @override void didReplace({Route newRoute, Route oldRoute}) { super.didReplace(newRoute: newRoute, oldRoute: oldRoute); print('didReplace newRoute: $newRoute,oldRoute:$oldRoute'); } @override void didRemove(Route route, Route previousRoute) { super.didRemove(route, previousRoute); print('didRemove route: $route,previousRoute:$previousRoute'); } @override void didStartUserGesture(Route route, Route previousRoute) { super.didStartUserGesture(route, previousRoute); print('didStartUserGesture route: $route,previousRoute:$previousRoute'); } @override void didStopUserGesture() { super.didStopUserGesture(); print('didStopUserGesture'); }}

使用:

void main() {  runApp(MyApp());}MyRouteObserver
myRouteObserver = MyRouteObserver
();class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', navigatorObservers: [myRouteObserver], initialRoute: '/A', home: APage(), ); }}

此时从 A 页面 跳转到 B 页面,日志输出如下:

flutter: didPush route: MaterialPageRoute
(RouteSettings("/B", 来自A), animation: AnimationController#6d429(▶ 0.000; for MaterialPageRoute
(/B))),previousRoute:MaterialPageRoute
(RouteSettings("/A", null), animation: AnimationController#e60f7(⏭ 1.000; paused; for MaterialPageRoute
(/A)))

转载地址:http://juhni.baihongyu.com/

你可能感兴趣的文章
数据动态绑定的简单实现——基于ES5对象的getter/setter机制
查看>>
vue源码系列文章good
查看>>
前端跨域解决方案
查看>>
Web前端面试——HTTP部分
查看>>
HTTP必知必会——常见面试题总结
查看>>
你不知道的Virtual DOM
查看>>
VUE面试题总结
查看>>
写好JavaScript条件语句的5条守则
查看>>
原生JS中DOM节点相关API合集
查看>>
新手快速上手webpack4打包工具的使用
查看>>
发布 react 组件到 npm
查看>>
定制化你的ReactNative底部导航栏
查看>>
Lodash是如何实现深拷贝的
查看>>
面试题之如何实现一个深拷贝
查看>>
React中使用CSS的7中方式(应该是最全的)
查看>>
常见(XSS|CSRF)六大Web安全攻防解析
查看>>
前端基础面试整理
查看>>
React-router路由基本原理
查看>>
redux源码解析
查看>>
React.js 常见问题
查看>>