Flutter pushReplaceNamed 无法正常工作

Flutter pushReplaceNamed is not working correctly

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

用户登录后,我使用 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}',
              ),
            ),
          ),
        );
    }
  }
}

在您的场景中,用户将能够拖动到弹出窗口并将 return 拖到 EmailView 因为您将登录名替换为主页,这是发生了什么事吗?如果你想在推送到 HomeView 时弹出所有这些(StartViewEmailViewLoginView),那么使用:

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

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

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

在 Omar 的帮助下,我让它工作了:所以 pushReplaceNamed 只是替换了最上面的路线。就我而言,我所要做的就是致电:

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

引用doc

To remove all the routes below the pushed route, use a [RoutePredicate] that always returns false (e.g. (Route route) => false).