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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:10:16