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
时弹出所有这些(StartView
、EmailView
、LoginView
),那么使用:
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).
我在我的应用程序中苦苦挣扎:
用户登录后,我使用 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
时弹出所有这些(StartView
、EmailView
、LoginView
),那么使用:
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).