You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 10:10:28