首页 > 解决方案 > 整个应用程序的通用导航侦听器

问题描述

我正在尝试找到一种在我的应用程序(MaterialApp)的根目录中设置全局导航侦听器的方法,它可以让我跟踪所有导航事件,包括实际路线名称(例如/home/page1)、导航类型等.

我搜索类似:

MaterialApp(
  initialRoute: '/',
  onGenerateRoute: (RouteSettings settings) => route(settings),
  onNavigationChange: (RouteType type, String currentRoute) {
    // type can an enum be like: 'pop', 'push', 'replace' etc.
    // currentRoute is the current route name defined in a pushNamed for example
  }
),

注意:此代码是非功能性的,仅用于说明我想要的;)

在我的搜索过程中,我发现了一些解决方案,例如RouteObserverroute_observer_mixin,这几乎是我正在寻找的,但我需要用一个 mixin 来包装我的所有页面......所以没有一个全局解决方案:/

你有什么线索吗?

提前致谢,

感谢@pskink 进行编辑,请参阅下面的解决方案

标签: flutterflutter-dependenciesflutter-navigation

解决方案


最终的解决方案是像这样创建 RouteObserver 的扩展:

class MyNavigatorObserver extends RouteObserver<PageRoute<dynamic>> {
  @override
  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
    super.didPush(route, previousRoute);
    if (route is PageRoute) {
      // do stuff
    }
  }

  @override
  void didReplace({Route<dynamic> newRoute, Route<dynamic> oldRoute}) {
    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
    if (newRoute is PageRoute) {
      // do stuff
    }
  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic> previousRoute) {
    super.didPop(route, previousRoute);
    if (previousRoute is PageRoute && route is PageRoute) {
      // do stuff
    }
  }
}

然后在 MaterialApp 小部件上设置它:

static MyNavigatorObserver observer =
  new MyNavigatorObserver();

MaterialApp(
  initialRoute: '/',
  onGenerateRoute: (RouteSettings settings) => route(settings),
  navigatorObservers: [observer],
),

谢谢@pskink!


推荐阅读