如何配置go_router的redirect回调,实现未登录用户可正常使用应用、已登录用户访问登录页时自动重定向?
如何配置go_router的redirect回调,实现未登录用户可正常使用应用、已登录用户访问登录页时自动重定向?
我来帮你梳理下怎么用go_router的redirect回调实现你要的需求,刚好之前做项目时遇到过类似的场景,分享下我的实现思路:
核心思路
要实现这个效果,关键是让go_router能实时感知登录状态的变化,然后在redirect回调里根据当前路由和登录状态做判断:
- 未登录用户访问需要权限的页面 → 重定向到登录页
- 已登录用户访问登录页 → 自动重定向回首页
- 其他场景(未登录用普通功能、已登录用任意功能)→ 正常跳转,不干预
具体实现步骤
1. 先做登录状态管理
首先你需要一个能通知状态变化的登录状态类,这里用ChangeNotifier举例子(你也可以换成Riverpod、Bloc这类你常用的状态管理工具):
class AuthState extends ChangeNotifier { bool _isLoggedIn = false; bool get isLoggedIn => _isLoggedIn; // 登录成功后调用这个方法更新状态 void login() { _isLoggedIn = true; notifyListeners(); // 通知go_router状态变化,触发redirect逻辑 } void logout() { _isLoggedIn = false; notifyListeners(); } }
2. 配置go_router的redirect和路由
接下来是go_router的核心配置,重点关注redirect回调和refreshListenable:
final GlobalKey<NavigatorState> _rootNavigatorKey = GlobalKey<NavigatorState>(); final router = GoRouter( navigatorKey: _rootNavigatorKey, redirect: (context, state) { // 获取当前登录状态 final authState = Provider.of<AuthState>(context, listen: false); final isLoggedIn = authState.isLoggedIn; final currentPath = state.location; // 定义需要登录才能访问的页面路径,根据你的实际路由调整 const requiresAuthPaths = ['/profile', '/settings']; // 情况1:未登录用户访问需要权限的页面 → 跳登录页 if (!isLoggedIn && requiresAuthPaths.contains(currentPath)) { return '/login'; } // 情况2:已登录用户访问登录页 → 跳首页 if (isLoggedIn && currentPath == '/login') { return '/'; } // 其他情况不重定向,返回null即可 return null; }, // 关联登录状态,状态变化时自动触发redirect refreshListenable: AuthState(), routes: [ GoRoute( path: '/', builder: (context, state) => const HomePage(), ), GoRoute( path: '/login', builder: (context, state) => LoginPage( onLogin: () { // 登录按钮点击后,只需要更新登录状态 final authState = Provider.of<AuthState>(context, listen: false); authState.login(); // 这里完全不用手动pop或push页面,redirect会自动帮你跳回首页 }, ), ), // 需要登录的页面示例 GoRoute( path: '/profile', builder: (context, state) => const ProfilePage(), ), GoRoute( path: '/settings', builder: (context, state) => const SettingsPage(), ), ], );
关键细节说明
refreshListenable的作用:这个参数是让go_router监听登录状态的变化,当你调用notifyListeners()时,go_router会自动重新执行redirect回调,这样就能实现登录后自动跳转的效果,完全不用手动处理页面导航。- redirect逻辑的灵活性:你可以根据自己的需求调整判断条件,比如如果有多个登录相关页面(比如注册页),也可以把这些页面加入判断,让已登录用户访问时自动跳走。
- 状态管理的适配:如果用的是Riverpod,你可以用
GoRouterRefreshStream来监听登录状态的流;如果是Bloc,也可以通过对应的方式让go_router感知状态变化,核心逻辑都是一样的。
备注:内容来源于stack exchange,提问作者Sandeep Singh
相关产品推荐
相关产品推荐

