0

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

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

我只是调用:

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

在显示应用程序的第一次启动时StartView,我从那里导航EmailViewLoginView. 上面的代码在我的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}',
              ),
            ),
          ),
        );
    }
  }
}
4

2 回答 2

1

在您的场景中,用户将能够拖动弹出并返回EmailView导致您将登录替换为主页,这是正确的吗?如果您想在推到 时弹出所有这些 ( StartView, EmailView, ),请使用:LoginViewHomeView

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

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

MaterialPageRoute(
      settings: RouteSettings(name: /*name of the route*/),
      builder: (context) => ...
于 2022-01-07T23:31:08.780 回答
0

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

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

引用doc

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

于 2022-01-08T10:40:56.863 回答