【问题标题】:Flutter pushReplaceNamed is not working correctlyFlutter pushReplaceNamed 无法正常工作
【发布时间】:2022-01-07 20:03:09
【问题描述】:

我在我的应用程序中苦苦挣扎:

用户登录后,我使用pushReplaceNamed 导航到我的HomeView,因此用户应该无法弹出(通过拖动)HomeView,因为在我看来是根视图。然而事实并非如此。即使在调用pushReplaceNamed 之后,用户仍然可以拖动弹出:

我只是调用:

 Navigator.pushReplacementNamed(
                          context,
                          Views.home,
                        );

在应用程序第一次启动时显示StartView,从那里我导航到EmailView,然后从那里导航到LoginView。上面的代码在我的LoginView 里面。在所有其他视图中,我只需调用pushNamed

我在这里缺少什么?为什么用户可以在HomeView上拖动弹窗? (我知道我可以用WillPopScope 禁用它,但感觉不对……)

这是我在MaterialApp 中的设置:

  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'AppFlug',
      navigatorKey: Get.key,
      theme: ThemeData(
        fontFamily: AppTextStyles.montserrat,
        primarySwatch: ColorService.createMaterialColor(
          AppColors.blue,
        ),
        backgroundColor: AppColors.white,
        scaffoldBackgroundColor: AppColors.white,
      ),
      initialRoute:
          AuthenticationService.isLoggedIn() ? Views.home : Views.start,
      onGenerateRoute: AppRouter.generateRoute,
    );
  }

这是我的AppRouter

class AppRouter {
  static Route<dynamic> generateRoute(RouteSettings settings) {
    switch (settings.name) {
      case Views.start:
        return MaterialPageRoute(
          builder: (context) => const StartView(),
        );

      case Views.email:
        return MaterialPageRoute(
          builder: (context) => EmailView(),
        );

      case Views.signUp:
        String email = settings.arguments as String;
        return MaterialPageRoute(
          builder: (context) => SignUpView(
            email: email,
          ),
        );

      case Views.login:
        String email = settings.arguments as String;
        return MaterialPageRoute(
          builder: (context) => LoginView(
            email: email,
          ),
        );

      case Views.home:
        return MaterialPageRoute(
          builder: (context) => HomeView(),
        );

      default:
        return MaterialPageRoute(
          builder: (_) => Scaffold(
            body: Center(
              child: Text(
                'No route defined for ${settings.name}',
              ),
            ),
          ),
        );
    }
  }
}

【问题讨论】:

    标签: flutter dart navigation flutter-routes


    【解决方案1】:

    在您的场景中,用户将能够拖动弹出并返回到EmailView,因为您将登录替换为主页,这是正确的吗?如果你想在推送到HomeView 时弹出所有这些(StartViewEmailViewLoginView),然后使用:

    Navigator.pushNamedAndRemoveUntil(context, Views.Home, (route) => route.settings.name == '/')
    

    另外,将此添加到您的 AppRouter 案例中

    MaterialPageRoute(
          settings: RouteSettings(name: /*name of the route*/),
          builder: (context) => ...
    

    【讨论】:

    • 哦,知道了,所以pushReplaceNamed 只是替换最上面的路线。就我而言,我所要做的就是致电:Navigator.pushNamedAndRemoveUntil( context, Views.home, (route) =&gt; false, );,因为我想删除以下所有路线
    【解决方案2】:

    在 Omar 的帮助下,我得到了它的工作:所以pushReplaceNamed 只是替换了最顶层的路线。就我而言,我所要做的就是打电话:

    Navigator.pushNamedAndRemoveUntil(
      context,
      Views.home,
      (route) => false,
    );
    

    引用doc

    要删除推送路由下方的所有路由,请使用始终返回 false 的 [RoutePredicate](例如 (Route route) => false)。

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2021-05-17
      • 2021-09-04
      • 2021-06-11
      • 2018-09-27
      • 2021-05-28
      • 2020-08-14
      • 2021-07-14
      • 2019-07-29
      相关资源
      最近更新 更多