如何使用GoRouter正确重定向到路由



如何正确重定向到路由?

我的应用程序必须具有一些路由安全性,我尝试使用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>

相关内容

  • 没有找到相关文章

最新更新