在 GlobalKey<NavigatorState> 上调用 popUntil 时路由返回 null

Routes returning null while calling popUntil on GlobalKey<NavigatorState>

我正在使用全局键来处理我的导航。 main.dart、路由和导航服务如下。使用全局键的主要目的是使导航独立于上下文,以便网络模块可以在刷新令牌过期时通过 dio 拦截器自动注销用户。

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
          return MaterialApp(
          title: 'AZY APP',
          navigatorKey: locator<NavigationService>().navigatorKey,
          onGenerateRoute: router.generateRoute,
          home: HomePageScreen())
          
}}

NavigationService.dart

class NavigationService {
  final GlobalKey<NavigatorState> navigatorKey =
      new GlobalKey<NavigatorState>();

  Future<dynamic> navigateTo(String routeName, {dynamic arguments}) {
    return navigatorKey.currentState.pushNamed(routeName, arguments: arguments);
  }

  pop(value) {
    print("pop");
    return navigatorKey.currentState.pop(value);
  }

  goBack() {
    print("goback");
    return navigatorKey.currentState.pop();
  }

  popUntil(String desiredRoute) {
    return navigatorKey.currentState.popUntil((route) {
      print("${route.settings.name}");
      return route.settings.name == desiredRoute;
    });
  }

  pushReplacementNamed(String route) {
    print("pushReplacementNamed");
    return navigatorKey.currentState.pushReplacementNamed(route);
  }
}

Routes.dart


Route<dynamic> generateRoute(RouteSettings settings) {
  final args = settings.arguments;

  switch (settings.name) {
    case routes.SplashScreenRoute:
      return MaterialPageRoute(builder: (context) => SplashScreen());

    case routes.LoginScreenRoute:
      return MaterialPageRoute(builder: (context) => LoginScreen());

    case routes.MainPageScreenRoute:
      return MaterialPageRoute(builder: (context) => MainPageScreen());

    case routes.HomePageScreenRoute:
      return MaterialPageRoute(builder: (context) => HomePageScreen());

    default:
      return MaterialPageRoute(
        builder: (context) => Scaffold(
          body: Center(
            child: Text('Error Loading Screen'),
          ),
        ),
      );
  }
}

NavigationService 中除 popUntil 之外的所有功能都运行良好。对于每条路线,settings.name 为空,因此我无法将 navigatorkey 与 popUntil 一起使用。

打印日志(“${route.settings.name}”)。

问题是我没有将路由设置传递给路由器中的 MaterialPageRoute。

MaterialPageRoute(
          settings: settings, builder: (context) => SplashScreen());