开发中经常遇到
-
<李>路由跳转时拿不到上下文怎么办,如:令牌失效/异地登录跳转登录页面。李>
<李>获取不到当前路由名称怎么办,如:点击推推送跳转指定路由,如果已经在当前页面就替换,如果不在就推。李>
<李>注册监听路由跳转,做一些想做的事情,例如:不同路由,显示不同状态栏颜色。李>
<李>等等…李>
解决思路:
-
<李> MaterialApp的路线属性赋值路由数组,navigatorObservers属性赋值路由监听对象NavigatorManager。李>
<李>在NavigatorManager里实现NavigatorObserver的didPush/didReplace/didPop/didRemove,并记录到路由栈_mRoutes列表中。李>
<李>将实时记录的路由跳转,用流发一个广播,哪里需要哪里注册。李>
<强> main.dart 强>
MaterialApp ( navigatorObservers:(NavigatorManager.getInstance ()), 路线:NavigatorManager.configRoutes, … )
navigator_manager.dart
类NavigatorManager延伸NavigatorObserver { *//*配置路线 静态Map<字符串,WidgetBuilder>configRoutes={ PackageInfoPage。sName:(上下文)=比; SplashPage。sName:(上下文)=比;SplashPage (), LoginPage。sName:(上下文)=比;SplashPage ()), 主页。sName:(上下文)=比;SplashPage (),//? }//当前路由栈 静态List_mRoutes; List 获取路线=比;_mRoutes;//当前路由 路线得到currentRoute=比;_mRoutes [_mRoutes。长度- 1];//流相关 静态StreamController _streamController; StreamController得到StreamController=比;_streamController;//用来路由跳转 静态NavigatorState导航;/*单例给出NavigatorManager */静态NavigatorManager NavigatorManager; 静态NavigatorManager getInstance () { 如果(navigatorManager==null) { navigatorManager=new navigatorManager (); _streamController=StreamController.broadcast (); } 返回navigatorManager; }//替换页面 pushReplacementNamed (String routeName (WidgetBuilder builder)) { 返回navigator.pushReplacement ( CupertinoPageRoute ( 建造者:builder & # 63; & # 63;configRoutes [routeName], 设置:RouteSettings(名字:routeName), ), ); }//按页面 pushNamed (String routeName (WidgetBuilder builder)) { 返回navigator.push ( CupertinoPageRoute ( 建造者:builder & # 63; & # 63;configRoutes [routeName], 设置:RouteSettings(名字:routeName), ), ); }//弹出页面 pop (结果[T]) { navigator.pop(结果); }//将一个页面,移除该页面下面所有页面 pushNamedAndRemoveUntil(字符串newRouteName) { 返回导航器。pushNamedAndRemoveUntil (newRouteName, (Route 路线)=比;假); }//当调用Navigator.push时回调 @override 空白didPush(路线路线,路线previousRoute) { 超级。didPush(路线,previousRoute); 如果(_mRoutes==null) { _mRoutes=new List (); }//这里过滤调推的是对话框的情况 如果(路线CupertinoPageRoute | |路线MaterialPageRoute) { _mRoutes.add(路线); routeObserver (); } }//当调用Navigator.replace时回调 @override 空白didReplace ({newRoute路线,路线oldRoute}) { super.didReplace (); 如果(newRoute CupertinoPageRoute | | newRoute MaterialPageRoute) { _mRoutes.remove (oldRoute); _mRoutes.add (newRoute); routeObserver (); } }//当调用Navigator.pop时回调 @override 空白didPop(路线路线,路线previousRoute) { 超级。didPop(路线,previousRoute); 如果(路线CupertinoPageRoute | |路线MaterialPageRoute) { _mRoutes.remove(路线); routeObserver (); } } @override 空白didRemove (removedRoute路线,路线oldRoute) { 超级。didRemove (removedRoute oldRoute); 如果(removedRoute CupertinoPageRoute | | removedRoute MaterialPageRoute) { _mRoutes.remove (removedRoute); routeObserver (); } } 空白routeObserver () { LogUtil。我(sName’,和路由栈,,'); LogUtil。我(sName _mRoutes); LogUtil。我(sName’,,,当前路由,,'); LogUtil。我(sName _mRoutes [_mRoutes。长度- 1]);//当前页面的导航器,用来路由跳转 导航器=_mRoutes [_mRoutes。长度- 1].navigator; streamController.sink.add (_mRoutes); } }
牌失效跳转