有没有办法在Flutter中监听导航器的路线变化?基本上,我希望在推送或弹出路线时得到通知,并从通知中返回屏幕上显示的当前路线
tvz2xvvm1#
在navigator观察器的基础上,还可以使用RouteObserver和RouteAware。
wb1gzix02#
导航器有observers。您可以实现NavigatorObserver并接收详细信息通知。
cedebl8k3#
我也在努力解决这个问题,对于我的目的来说,RouteObservers感觉有点大材小用,太多了。我最近处理它的方式是在我的MaterialApp中使用onGenerateRoute属性。所以如果你在应用程序中使用onGenerateRoute,这个解决方案更适用(如果您使用参数导航,可能特别有用)。您可以阅读有关它的更多信息here。我的MaterialApp看起来像这样:
RouteObservers
MaterialApp
onGenerateRoute
runApp(MaterialApp( title: 'bla', home: BuilderPage(LoginArguments(false)), onGenerateRoute: generateRoute ));
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。通过一些额外的实现,也可以通过注入的参数来观察。
Navigated to register
pushed
popped
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); } } }
像往常一样注册你的观察员,你应该很好地去。
4条答案
按热度按时间tvz2xvvm1#
在navigator观察器的基础上,还可以使用RouteObserver和RouteAware。
wb1gzix02#
导航器有observers。您可以实现NavigatorObserver并接收详细信息通知。
cedebl8k3#
我也在努力解决这个问题,对于我的目的来说,
RouteObservers
感觉有点大材小用,太多了。我最近处理它的方式是在我的MaterialApp
中使用onGenerateRoute
属性。所以如果你在应用程序中使用onGenerateRoute
,这个解决方案更适用(如果您使用参数导航,可能特别有用)。您可以阅读有关它的更多信息here。我的
MaterialApp
看起来像这样:generateRoute
方法如下所示:所以每次我都这样做,例如:
它将打印
Navigated to register
。我认为这种方式特别有用,如果你不一定需要知道你是pushed
还是popped
。通过一些额外的实现,也可以通过注入的参数来观察。8iwquhpp4#
1.使用auto_router
默认Flutter路由器source
像往常一样注册你的观察员,你应该很好地去。