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

Firebase Auth authStateChange状态不更新,需重启调试会话问题排查

问题分析与解决方案

核心问题根源

你的代码里存在两个致命的静态初始化问题:

  • 全局变量final User user = auth.currentUser!;和final uid = user.uid;是在应用启动时就固定的,只会读取一次初始用户信息,后续authStateChanges流触发状态更新时,这两个变量不会同步更新。
  • 启动页的StreamBuilder虽然监听了authStateChanges,但打印和后续页面跳转时没有使用snapshot中的实时用户数据,而是依赖了静态的全局uid,导致页面逻辑和实际登录状态脱节。

修复步骤

1. 修正启动页代码

移除静态全局用户变量,直接从authStateChanges的快照中获取实时用户数据,并传递给主页:

import 'dart:async';

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:prac_crud/screens/homepage.dart';
import 'package:prac_crud/screens/login.dart';

final FirebaseAuth auth = FirebaseAuth.instance;

class Splash extends StatefulWidget {
  const Splash({super.key});
  @override
  State<Splash> createState() {
    return _Splash();
  }
}

class _Splash extends State<Splash> {
  @override
  void initState() {
    super.initState();
    navigatetoNext();
  }

  void navigatetoNext() {
    Timer(const Duration(seconds: 3), () {
      Navigator.of(context).pushReplacement(
        MaterialPageRoute(
          builder: (context) {
            return StreamBuilder<User?>(
              stream: FirebaseAuth.instance.authStateChanges(),
              builder: (context, snapshot) {
                // 从快照中获取实时用户ID
                final currentUid = snapshot.data?.uid;
                print("User is: $currentUid");
                
                if (snapshot.connectionState == ConnectionState.waiting) {
                  return const CircularProgressIndicator();
                } else if (snapshot.hasData) {
                  // 将实时用户传递给主页
                  return HomePage(currentUser: snapshot.data!);
                }
                return const Login();
              },
            );
          },
        ),
      );
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Image.asset(
              "assets/images/pngwing.com.png",
              width: 230,
            ),
            const SizedBox(height: 24),
            const CircularProgressIndicator(
              color: Colors.red,
            ),
          ],
        ),
      ),
    );
  }
}

2. 修正主页数据监听逻辑

主页需要基于实时用户ID监听Firestore数据,确保用户切换时自动更新数据流:

import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

class HomePage extends StatefulWidget {
  final User currentUser;
  const HomePage({super.key, required this.currentUser});

  @override
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  late Stream<DocumentSnapshot> userDataStream;

  @override
  void initState() {
    super.initState();
    // 基于当前登录用户的ID创建Firestore数据流
    userDataStream = FirebaseFirestore.instance
        .collection('users')
        .doc(widget.currentUser.uid)
        .snapshots();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("Home"),
        actions: [
          IconButton(
            icon: const Icon(Icons.logout),
            onPressed: () async {
              await FirebaseAuth.instance.signOut();
              // 退出后清理页面栈,避免返回旧主页
              Navigator.of(context).pushReplacement(
                MaterialPageRoute(builder: (context) => const Login())
              );
            },
          )
        ],
      ),
      body: StreamBuilder<DocumentSnapshot>(
        stream: userDataStream,
        builder: (context, snapshot) {
          if (snapshot.connectionState == ConnectionState.waiting) {
            return const CircularProgressIndicator();
          }
          if (snapshot.hasError) {
            return Text('加载失败: ${snapshot.error}');
          }
          if (!snapshot.hasData || !snapshot.data!.exists) {
            return const Text("未找到用户数据");
          }
          final userData = snapshot.data!.data() as Map<String, dynamic>;
          return Center(child: Text("当前用户: ${userData['name']}"));
        },
      ),
    );
  }
}

额外注意事项

  • 检查Firestore安全规则,确保规则限制用户只能访问自己的文档(例如allow read, write: if request.auth.uid == resource.data.uid;),避免权限漏洞导致的旧数据残留。
  • 如果使用状态管理工具(如Provider、Riverpod),需确保用户状态更新时通知所有依赖组件刷新,避免缓存旧数据。

内容的提问来源于stack exchange,提问作者Ahmed Ikram

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:32:26