如何正确重定向到路由?
我的应用程序必须具有一些路由安全性,我尝试使用GoRouter来做到这一点但是它总是再执行一次重定向,并且总是返回主页。
只有3条安全路线(个人资料、订单、收藏夹(,如果您没有登录,则必须返回登录。
但当我把3条路线中的任何一条放在url中时,它会将我重定向到登录并立即重定向到主页(这是不应该发生的(
有人能帮我吗?我改变了好几次逻辑,但我总是回到同一点。
class AppRouter {
final SessionCubit sessionCubit;
GoRouter get router => _goRouter;
AppRouter(this.sessionCubit);
late final GoRouter _goRouter = GoRouter(
refreshListenable: GoRouterRefreshStream(sessionCubit.stream),
initialLocation: APP_PAGE.home.toPath,
routes: <GoRoute>[
GoRoute(
path: APP_PAGE.home.toPath,
name: APP_PAGE.home.toName,
builder: (context, state) => MyHomePage(),
),
GoRoute(
path: APP_PAGE.login.toPath,
name: APP_PAGE.login.toName,
builder: (context, state) => const LoginPage(),
),
GoRoute(
path: APP_PAGE.profile.toPath,
name: APP_PAGE.profile.toName,
builder: (context, state) => MyProfile(),
),
GoRoute(
path: APP_PAGE.page1.toPath,
name: APP_PAGE.page1.toName,
builder: (context, state) => const Page1(),
),
GoRoute(
path: APP_PAGE.error.toPath,
name: APP_PAGE.error.toName,
builder: (context, state) => ErrorPage(error: state.extra.toString()),
),
GoRoute(
path: APP_PAGE.page2.toPath,
name: APP_PAGE.page2.toName,
builder: (context, state) => const Page2(),
),
],
debugLogDiagnostics: true,
errorBuilder: (context, state) => ErrorPage(error: state.error.toString()),
redirect: (context, state) {
final userAutheticated = sessionCubit.state is Authenticated;
if (userAutheticated) {
if (state.subloc == '/login') return '/home';
if (state.subloc == '/profile') return '/profile';
if (state.subloc.contains('/page1')) return '/page1';
return '/home';
} else {
if (state.subloc == '/home') {
return '/home';
}
if (state.subloc == '/page2') {
return '/page2';
} else {
return '/login';
}
}
},
);
}
更新05/11我找到了解决方案。
第一个->使用go_router 5.1.5的最后一个版本(重定向问题在旧版本上(。
秒->我修改重定向逻辑:
if(!userAutheticated && !onloginPage && !onpublicPage1 && !onPublicPage2 && !onPublicPageN){
return '/login';
}
if (userAutheticated && onloginPage) {
return '/home';
}
//you must include this. so if condition not meet, there is no redirect
return null;
注意:我不知道为什么flutter web调试模式不能正常工作。所以我在发布模式下运行这个项目,Voilá,它很有效!。
非常感谢你的帮助!!!
只需检查您的用户是否已通过身份验证且不在登录页面中,然后重定向。如果你的用户已经登录,你不需要重定向:
final bool userAutheticated = sessionCubit.state is Authenticated;
final bool onloginPage = state.subloc == '/login';
if(!userAutheticated && !onloginPage){
return '/login';
}
if(userAutheticated && onloginPage){
return 'home';
}
//you must include this. so if condition not meet, there is no redirect
return null;
我认为问题出在return '/home';
中,您需要放return null
。
因为您为经过身份验证的用户处理了所有重定向,所以不需要另一个重定向,所以您只需通过返回null来告诉路由器停止重定向(当所有条件都没有触发时(。
区块报价
if (userAutheticated) {
if (state.subloc == '/login') return '/home';
if (state.subloc == '/profile') return '/profile';
if (state.subloc.contains('/page1')) return '/page1';
>> return '/home';
}
将initialLocation
更改为登录
late final GoRouter _goRouter = GoRouter(
refreshListenable: GoRouterRefreshStream(sessionCubit.stream),
// Change initialLocation to login
initialLocation: APP_PAGE.home.toPath,
下面链接中的示例可以帮助您解决这个问题;
go_router
<pre>
final GoRouter _router = GoRouter(routes: <RouteBase>[
GoRoute(
redirect: (BuildContext context, GoRouterState state) {
// if (AuthState.of(context).isSignedIn) {
return '/join_us';
// } else {
// return null;
// }
},
path: '/',
builder: (BuildContext context, GoRouterState state) {
return const HomePage();
},
</pre>