Flutter   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了全局监听路由堆栈变化大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

全局监听路由堆栈变化

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

void main() {
  runApp(MyApp());
}

RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();

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<ARouteObserverDemo> 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: /ARouteObserver
Flutter: B-didPush route: /BRouteObserver

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

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

Flutter: A-didPopNext route: /ARouteObserver
Flutter: B-didPop route: /BRouteObserver

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

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

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

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

class MyRouteObserver<R extends Route<dynamic>> extends RouteObserver<R> {
  @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 did@R_874_9363@ce({Route newRoute,Route oldRoutE}) {
    super.did@R_874_9363@ce(newRoute: newRoute,oldRoute: oldRoutE);
    print('did@R_874_9363@ce 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<PageRoute> myRouteObserver = MyRouteObserver<PageRoute>();

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<dynamic>(RouteSetTings("/B",来自A),animation: AnimationController#6d429(▶ 0.000; for MaterialPageRoute<dynamic>(/B))),prevIoUsRoute:MaterialPageRoute<dynamic>(RouteSetTings("/A",null),animation: AnimationController#e60f7(⏭ 1.000; paused; for MaterialPageRoute<dynamic>(/A)))

交流

交流

老孟Flutter博客(330个控件用法+实战入门系列文章):http://laomengit.com

欢迎加入Flutter交流群(微信:laomENGIt)、关注公众号【老孟Flutter】:

全局监听路由堆栈变化

全局监听路由堆栈变化

大佬总结

以上是大佬教程为你收集整理的全局监听路由堆栈变化全部内容,希望文章能够帮你解决全局监听路由堆栈变化所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: