刷新 chrome 页面时用户变为空 flutter web firebase

User is turning null when refreshing chrome page flutter web firebase

我可以在网络中使用 Firebase Auth 正确登录和注册。 当我热重新加载页面时,用户信息保持不变并且他们保持登录状态。 但是,如果我刷新页面,使用 chrome,用户变为空,我需要重新登录。

授权服务:

    static Future<User?> signInUsingEmailPassword(
      {required String email,
      required String password,
      required BuildContext context}) async {
    FirebaseAuth auth = FirebaseAuth.instance;
    User? user;

    try {
      UserCredential userCredential = await auth.signInWithEmailAndPassword(
        email: email,
        password: password,
      );
      user = userCredential.user;
    } on FirebaseAuthException catch (e) {
      if (e.code == 'user-not-found') {
        
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Usuário não encontrado.'), duration: Duration(seconds: 4),));
 
      } else if (e.code == 'wrong-password') {
       ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text('Senha inválida.'), duration: Duration(seconds: 4),));
      }
    }

    return user;
  }

Main.dart:

 body: FutureBuilder(future: _initialization, builder: (context, snapshot){
      if(snapshot.hasError){
        return const Center(child: Text('Houve algum erro. Tente novamente'),);
      }
      if(snapshot.connectionState == ConnectionState.done){
        print('usuário: $user');
        print('emailVErified: ${user?.emailVerified}');
        if(user == null || user?.emailVerified == false){
          return const AuthenticationPage();
        }
        if (user != null && user?.emailVerified == true) {
          return const HomePage();
        }
      }
      return const Center(child: CircularProgressIndicator(),);
    },),

这是预期的行为。 Firebase 在用户登录时存储用户凭据,然后在页面(或应用程序)重新加载时恢复它们。但是,这需要它调用服务器,例如检查帐户是否被禁用,并且在进行此调用时,您的代码继续 运行 并且 currentUsernull

要在 sign-in 恢复(或恢复失败)时正确接听,您需要实施身份验证状态侦听器,如 [=16] 文档中的第一个片段所示=]:

FirebaseAuth.instance
  .authStateChanges()
  .listen((User? user) {
    if (user != null) {
      print(user.uid);
    }
  });

因此您可以 listen 进入身份验证状态,或者您可以将其包装在 build 方法中的 StreamBuilder 中,让您的 UI 响应所有身份验证状态变化。