颤振上线项目实战记录之路由篇

  

  

开发中经常遇到

  
      <李>路由跳转时拿不到上下文怎么办,如:令牌失效/异地登录跳转登录页面。   <李>获取不到当前路由名称怎么办,如:点击推推送跳转指定路由,如果已经在当前页面就替换,如果不在就推。   <李>注册监听路由跳转,做一些想做的事情,例如:不同路由,显示不同状态栏颜色。   <李>等等…   
  

  

解决思路:

  
      <李> 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);   }   }      

  

牌失效跳转

     

颤振上线项目实战记录之路由篇