Flutter FirebaseAuth登录成功后无法跳转至主页问题求助
Flutter登录成功后无法跳转至主页问题
问题描述
在Flutter应用中实现用户登录后跳转主页功能时,日志显示用户已成功登录,但页面无法自动跳转到主页。已确认以下配置无误:
- 设备网络连接正常
- AndroidManifest.xml的application标签内已添加对应配置
- 密码长度符合要求(6位)
- Firebase控制台已启用邮箱/密码登录方式
相关日志
I/FirebaseAuth(13286): Logging in as test@gmail.com with empty reCAPTCHA token
2
W/System (13286): Ignoring header X-Firebase-Locale because its value was null.
D/FirebaseAuth(13286): Notifying id token listeners about user (gWbF8CfrhthiL7YrjszqDDnaI462 ).
相关代码
主页代码
import 'package:flutter/material.dart'; import 'package:firebase_auth/firebase_auth.dart'; class HomePage extends StatefulWidget { const HomePage({super.key}); @override State<HomePage> createState() => _HomePageState(); } class _HomePageState extends State<HomePage> { final user = FirebaseAuth.instance.currentUser!; @override Widget build(BuildContext context) { return const Scaffold( body: Center( child: Column( children: [ Text('User signed in'),
登录页代码
class _LoginPageState extends State<LoginPage> { //Txt Controllers final _emailController = TextEditingController(); final _passwordController = TextEditingController(); //methods Future signIn() async { try { await FirebaseAuth.instance.signInWithEmailAndPassword( email: _emailController.text.trim(), password: _passwordController.text.trim()); } on FirebaseAuthException catch (e) { if (e.code == 'user-not-found') { print('No existing User'); } else if (e.code == 'wrong-password') { print('Wrong password');
MainPage代码
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart'; import 'package:yuhikexxx/login_page.dart'; import 'package:yuhikexxx/home_page.dart'; class MainPage extends StatelessWidget { const MainPage({super.key}); @override Widget build(BuildContext context) { return Scaffold( body: StreamBuilder<User?>( stream: FirebaseAuth.instance.authStateChanges(), builder: (context, snapshot) { if (snapshot.hasData) { return HomePage(); } else { return const LoginPage(); } }, ), ); } }
主入口文件代码
import 'package:flutter/material.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:yuhikexxx/firebase_options.dart'; import 'package:yuhikexxx/login_page.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({super.key}); // This widget is the root of your application. @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), debugShowCheckedModeBanner: false, home: const LoginPage(), ); } }
解决方案
1. 修改主入口的默认主页
你的MyApp直接将home设置为LoginPage,没有使用带有StreamBuilder的MainPage监听用户登录状态变化。将MyApp的home替换为MainPage即可:
class MyApp extends StatelessWidget { const MyApp({super.key}); @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), useMaterial3: true, ), debugShowCheckedModeBanner: false, home: const MainPage(), // 替换为MainPage ); } }
2. 修复HomePage的用户状态获取逻辑
当前HomePage的user变量在State初始化时获取,不会随用户状态变化更新。改为在build方法中实时获取,同时增加未登录状态的处理:
class _HomePageState extends State<HomePage> { @override Widget build(BuildContext context) { final user = FirebaseAuth.instance.currentUser; if (user == null) { // 用户未登录时跳转回登录页 WidgetsBinding.instance.addPostFrameCallback((_) { Navigator.pushReplacement(context, MaterialPageRoute(builder: (_) => const LoginPage())); }); return const Scaffold(body: Center(child: CircularProgressIndicator())); } return Scaffold( body: Center( child: Column( children: [ Text('User signed in: ${user.email}'), // 补充其他UI代码 ], ), ), ); } }
3. 补全登录方法的代码结构
你的signIn方法缺少闭合大括号,补充完整以避免逻辑异常:
Future signIn() async { try { await FirebaseAuth.instance.signInWithEmailAndPassword( email: _emailController.text.trim(), password: _passwordController.text.trim()); } on FirebaseAuthException catch (e) { if (e.code == 'user-not-found') { print('No existing User'); } else if (e.code == 'wrong-password') { print('Wrong password'); } } catch (e) { // 处理其他异常 print(e.toString()); } }
修改完成后,用户登录成功时,authStateChanges流会触发更新,MainPage中的StreamBuilder会检测到snapshot.hasData为true,自动切换到HomePage。
内容的提问来源于stack exchange,提问作者Nesimix
相关产品推荐
相关产品推荐

