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
相关产品推荐
相关产品推荐

