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

Flutter GoRouter重定向后安卓返回键跳主页问题求助

解决Android端Flutter登录页返回键回到主页的问题

方案1:拦截登录页的返回事件

直接在登录页里拦截安卓返回键,禁用默认导航回退逻辑,触发返回时直接关闭应用。适配Flutter 3.12+可以用PopScope组件,旧版本替换为WillPopScope即可:

class LogIn extends StatelessWidget {
  const LogIn({super.key});

  @override
  Widget build(BuildContext context) {
    return PopScope(
      canPop: false, // 禁用默认返回行为
      onPopInvoked: (didPop) async {
        if (didPop) return;
        // 直接退出应用
        SystemNavigator.pop();
      },
      child: Scaffold(
        body: const Center(child: Text('登录页面')),
        // 你的登录表单等内容
      ),
    );
  }
}

方案2:优化GoRouter的redirect逻辑,清空导航栈

问题根源是未登录时redirect到登录页,但原本的主页路由还留在导航栈中。可以在redirect时用replace方式替换整个栈,让登录页成为栈内唯一页面:

final router = GoRouter(
  routes: [
    GoRoute(
      path: '/',
      builder: (context, state) => const HomePage(),
    ),
    GoRoute(
      path: '/login',
      builder: (context, state) => const LogIn(),
    ),
  ],
  redirect: (context, state) {
    // 替换成你的登录状态检查逻辑,比如Firebase用户判断
    final isLoggedIn = FirebaseAuth.instance.currentUser != null;
    final isOnLoginPage = state.uri.path == '/login';

    if (!isLoggedIn && !isOnLoginPage) {
      // 替换当前路由为登录页,清空导航栈
      state.replace('/login');
      return '/login';
    }
    return null;
  },
);

方案3:提前设置初始路由

启动APP时先同步检查用户登录状态,直接设定初始路由,避免redirect带来的栈残留问题,同时保留redirect处理后续的状态变化:

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  
  // 提前获取用户状态
  final currentUser = FirebaseAuth.instance.currentUser;
  // 确定初始页面
  final initialRoute = currentUser != null ? '/' : '/login';

  runApp(MyApp(initialRoute: initialRoute));
}

class MyApp extends StatelessWidget {
  final String initialRoute;

  const MyApp({super.key, required this.initialRoute});

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      routerConfig: GoRouter(
        initialLocation: initialRoute,
        routes: [
          GoRoute(
            path: '/',
            builder: (context, state) => const HomePage(),
          ),
          GoRoute(
            path: '/login',
            builder: (context, state) => const LogIn(),
          ),
        ],
        // 保留redirect处理后续跳转时的未登录情况
        redirect: (context, state) {
          final isLoggedIn = FirebaseAuth.instance.currentUser != null;
          final isOnLoginPage = state.uri.path == '/login';

          if (!isLoggedIn && !isOnLoginPage) {
            return '/login';
          }
          // 已登录时如果在登录页,跳回主页
          if (isLoggedIn && isOnLoginPage) {
            return '/';
          }
          return null;
        },
      ),
    );
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:40:59