dart Flutter中导航器路线变化的观察器

nbysray5  于 2023-04-27  发布在  Flutter
关注(0)|答案(4)|浏览(118)

有没有办法在Flutter中监听导航器的路线变化?基本上,我希望在推送或弹出路线时得到通知,并从通知中返回屏幕上显示的当前路线

tvz2xvvm

tvz2xvvm1#

在navigator观察器的基础上,还可以使用RouteObserverRouteAware

wb1gzix0

wb1gzix02#

导航器有observers。您可以实现NavigatorObserver并接收详细信息通知。

cedebl8k

cedebl8k3#

我也在努力解决这个问题,对于我的目的来说,RouteObservers感觉有点大材小用,太多了。我最近处理它的方式是在我的MaterialApp中使用onGenerateRoute属性。所以如果你在应用程序中使用onGenerateRoute,这个解决方案更适用(如果您使用参数导航,可能特别有用)。您可以阅读有关它的更多信息here
我的MaterialApp看起来像这样:

runApp(MaterialApp(
        title: 'bla',
        home: BuilderPage(LoginArguments(false)),
        onGenerateRoute: generateRoute
));

generateRoute方法如下所示:

Route<dynamic> generateRoute(RouteSettings settings) {
  switch (settings.name) {
    case 'main':
      print('Navigated to main')
      return MaterialPageRoute(builder: (_) => MainScreen());
    case 'register':
      print('Navigated to register')
      return MaterialPageRoute(builder: (_) => RegisterScreen());
    default:
      return MaterialPageRoute(
          builder: (_) => Scaffold(
                body: Center(
                    child: Text('No route defined for ${settings.name}')),
              ));
  }
}

所以每次我都这样做,例如:

Navigator.pushNamed(
        context,
        'register',
      );

它将打印Navigated to register。我认为这种方式特别有用,如果你不一定需要知道你是pushed还是popped。通过一些额外的实现,也可以通过注入的参数来观察。

8iwquhpp

8iwquhpp4#

1.使用auto_router

class LoggingNavigationObserver extends AutoRouterObserver {
  @override
  void didPush(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPush(route, previousRoute);
    print('Current Screen push: ${route.settings.name}');

  }

  @override
  void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didPop(route, previousRoute);
    //print('Current Screen pop: ${route.settings.name}');
    
  }

  @override
  void didReplace({Route<dynamic>? newRoute, Route<dynamic>? oldRoute}) {
    super.didReplace(newRoute: newRoute, oldRoute: oldRoute);
    print('Current Screen replace: ${newRoute?.settings.name}');
   
  }

  @override
  void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) {
    super.didRemove(route, previousRoute);
    print('Current Screen remove: ${route.settings.name}');
  
  }

  @override
  void didChangeTabRoute(TabPageRoute route, TabPageRoute? previousRoute) {
    // Handle tab route change in the navigator
    print('Tab route changed: ${route.name}');
   
  }

 
}

默认Flutter路由器source

class MyRouteObserver extends RouteObserver<PageRoute<dynamic>> {
  void _sendScreenView(PageRoute<dynamic> route) {
    var screenName = route.settings.name;
    print('screenName $screenName');
    // do something with it, ie. send it to your analytics service collector
  }

  @override
  void didPush(Route<dynamic> route, Route<dynamic> previousRoute) {
    super.didPush(route, previousRoute);
    if (route is PageRoute) {
      _sendScreenView(route);
    }
  }

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

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

像往常一样注册你的观察员,你应该很好地去。

相关问题