Flutter集成Firebase Auth后用户登录登出未自动跳转页面问题求助
故障根因
- 存在多层
MaterialApp嵌套:你在MyApp中已经初始化了根MaterialApp,Wrapper中根据登录状态又分别返回了两个独立的子MaterialApp,每个MaterialApp都有独立的导航栈。你从Welcome页跳转注册页时,路由压入了未登录状态下的子MaterialApp导航栈,注册成功后Wrapper会销毁整个未登录子MaterialApp、替换为已登录子MaterialApp,但当前显示页面还停留在旧导航栈的注册页,不会自动切换。 - 注册逻辑缺少后续处理:调用注册接口成功后没有主动清理旧导航栈、跳转目标页面,导致页面停留在注册页。
修复步骤
1. 移除冗余的MaterialApp嵌套,统一路由管理
修改MyApp代码,移除根节点的MaterialApp,将全局唯一的MaterialApp放到Wrapper中统一管理路由:
class MyApp extends StatelessWidget { final Future<FirebaseApp> _initialization = Firebase.initializeApp(); @override Widget build(BuildContext context) { return FutureBuilder( future: _initialization, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.done) { return StreamProvider<User>.value( value: AuthService().user, child: const Wrapper(), ); } return const MaterialApp(home: Center(child: CircularProgressIndicator())); }, ); } }
修改Wrapper代码,统一配置全量路由,根据用户状态动态控制根路由显示的页面:
class Wrapper extends StatelessWidget { const Wrapper({Key key}) : super(key: key); @override Widget build(BuildContext context) { final user = Provider.of<User>(context); return MaterialApp( routes: { '/': (context) => user != null ? const Home() : const Welcome(), '/profile': (context) => const Profile(), '/signup': (context) => const SignUp(), '/signin': (context) => const SignIn(), }, ); } }
2. 注册成功后主动清空导航栈跳转根路由
在注册按钮的点击逻辑中,处理注册结果,成功后清空当前导航栈跳转到根路由,此时全局用户状态已更新,根路由会自动显示Home页:
onPressed: () async { // 调用注册方法,inputEmail、inputPassword为你收集的用户输入值 String res = await AuthService().signUp(inputEmail, inputPassword); if (context.mounted) { if (res == "") { // 注册成功,清空所有历史路由跳转到根页 Navigator.pushNamedAndRemoveUntil(context, '/', (route) => false); } else { // 此处可添加错误提示逻辑 ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(res))); } } }
内容的提问来源于stack exchange,提问作者blessedone
相关产品推荐
相关产品推荐

