【问题标题】:Routes returning null while calling popUntil on GlobalKey<NavigatorState>在 GlobalKey<NavigatorState> 上调用 popUntil 时路由返回 null
【发布时间】:2020-12-25 13:56:01
【问题描述】:

我正在使用全局键来处理我的导航。 main.dart、routes 和 NavigationService 如下。使用全局键的主要目的是使导航独立于上下文,以便网络模块可以在刷新令牌过期时通过 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 为 null,因此我无法将 navigatorkey 与 popUntil 一起使用。

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

【问题讨论】:

    标签: flutter flutter-navigation


    【解决方案1】:

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

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

    【讨论】:

    • 我正在做一些非常相似的事情,如果不等于你所拥有的。您如何获取从 navigatorKey.currentState.pop(value); 传递的值;
    • @JoãoPalma 我只是在等待结果。 var myResult = await locator&lt;NavigationService&gt;().navigateTo(routes.SomePickerScreen);
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2019-07-20
    相关资源
    最近更新 更多