我正在使用命名路线进行导航。我正在传递路线名称以查看新屏幕。
Navigator.pushNamed(context, '/second');
所以,我需要的是最上面的屏幕routeName。在这种情况下为CCD_ 1。我怎样才能拿到它?
除了Modal.of(context)
,flutter没有提供任何更容易的方法来获取最新的路由名称。但是任何使用onRouteGenerated
属性进行路由处理的人都可以执行此
class AllRoutes{
static String _lastRoute = "/";
static Route onGenerated(RouteSettings settings){
_lastRoute = settings.name;
//handle route changes here rather passing the route Map to the App
}
static String get lastRoute=>_lastRoute;
}
并添加静态方法作为App 的onGenerateRoute
属性值
MaterialApp(
onGenerateRoute: AllRoutes.onGenerated,
)
然后得到最后一条像一样的路线
var lastRoute = AllRoutes.lastRoute
你可以将其添加为Navigator
的扩展,这样你就可以有宾至如归的感觉;(
您可以在MaterialApp的navigatorObserver中注册为观察员,以便在路线更改时收到通知,并保留最后一个:
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'test',
home: const MyHomePage(),
navigatorObservers: [
RouteObserver(),
],
);
}
}
class RouteObserver extends NavigatorObserver {
String? lastRoute;
@override
void didReplace({Route? newRoute, Route? oldRoute}) {
lastRoute = newRoute?.settings.name;
}
@override
void didPush(Route route, Route? previousRoute) {
lastRoute = route.settings.name;
}
@override
void didPop(Route<dynamic> route, Route<dynamic>? previousRoute) {
lastRoute = previousRoute?.settings.name;
}
@override
void didRemove(Route<dynamic> route, Route<dynamic>? previousRoute) {
lastRoute = previousRoute?.settings.name;
}
}
String? getTopRouteName (BuildContext context) {
String? top;
Navigator.popUntil(context, (route) {
top = route.settings.name;
return true;
});
return top;
}
遗憾的是,Navigator
没有提供这样的API。但是最顶端的路由名称可以通过这个棘手的方法找到,该方法试图弹出最顶端的路径,但被返回值true
阻止。