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

GoRouter重定向循环问题求助:无法跳转至Launch页面

GoRouter重定向循环问题解决

问题根源

你的代码存在三个核心问题,导致无限循环:

  1. 错误的重定向方式:在redirect回调中直接调用router.go('/launch'),而GoRouter的redirect设计是返回重定向路径而非主动触发跳转,主动跳转会再次触发redirect,形成循环。
  2. 重复监听Auth状态:每次执行redirect都会创建一个新的authStateChanges()监听,导致多个监听同时触发,重复打印日志。
  3. 未判断当前路由:即使跳转到/launch页面后,redirect仍会执行,再次尝试跳转,无法终止循环。

修复方案

步骤1:用ValueNotifier管理用户状态

将Firebase Auth的状态转为GoRouter可监听的对象,确保状态变化时自动刷新路由:

final userState = ValueNotifier<User?>(FirebaseAuth.instance.currentUser);

void initAuthListener() {
  FirebaseAuth.instance.authStateChanges().listen((user) {
    userState.value = user;
  });
}

步骤2:配置GoRouter的refreshListenable和正确的redirect逻辑

设置refreshListenable为userState,让路由在用户状态变化时自动刷新;在redirect中根据当前用户状态和路由位置返回对应路径,避免循环:

final GoRouter router = GoRouter(
  initialLocation: '/',
  refreshListenable: userState,
  routes: <RouteBase>[
    GoRoute(
      path: '/',
      name: 'home',
      builder: (BuildContext context, GoRouterState state) =>
          const NavBarPage(initialPage: 'Home'),
    ),
    GoRoute(
      path: '/menu',
      name: 'menu',
      builder: (context, state) => const MainMenuPage(),
    ),
    GoRoute(
      path: "/createPost",
      name: 'createPost',
      builder: (context, state) => const CreatePostPage(),
    ),
    GoRoute(
      path: "/launch",
      name: 'launch',
      builder: (context, state) => const LaunchPage(),
    ),
  ],
  redirect: (BuildContext context, GoRouterState state) {
    final user = userState.value;
    final isOnLaunchPage = state.location == '/launch';
    
    // 未登录且不在登录页,重定向到launch
    if (user == null && !isOnLaunchPage) {
      return '/launch';
    }
    
    // 已登录但在登录页,重定向到首页
    if (user != null && isOnLaunchPage) {
      return '/';
    }
    
    // 其他情况不重定向
    return null;
  },
);

步骤3:初始化Auth监听

在应用启动时调用initAuthListener(),确保用户状态被正确监听:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  initAuthListener();
  runApp(const MyApp());
}

为什么这样能解决问题

  • 通过refreshListenable让GoRouter自动响应用户状态变化,无需手动调用跳转。
  • redirect仅返回路径,由GoRouter处理跳转逻辑,避免重复触发回调。
  • 增加当前路由判断,确保已在目标页面时不再重定向,终止循环。

内容的提问来源于stack exchange,提问作者ramluro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 08:40:32