刷新 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 在用户登录时存储用户凭据,然后在页面(或应用程序)重新加载时恢复它们。但是,这需要它调用服务器,例如检查帐户是否被禁用,并且在进行此调用时,您的代码继续 运行 并且 currentUser
是 null
。
要在 sign-in 恢复(或恢复失败)时正确接听,您需要实施身份验证状态侦听器,如 [=16] 文档中的第一个片段所示=]:
FirebaseAuth.instance
.authStateChanges()
.listen((User? user) {
if (user != null) {
print(user.uid);
}
});
因此您可以 listen
进入身份验证状态,或者您可以将其包装在 build
方法中的 StreamBuilder
中,让您的 UI 响应所有身份验证状态变化。
我可以在网络中使用 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 在用户登录时存储用户凭据,然后在页面(或应用程序)重新加载时恢复它们。但是,这需要它调用服务器,例如检查帐户是否被禁用,并且在进行此调用时,您的代码继续 运行 并且 currentUser
是 null
。
要在 sign-in 恢复(或恢复失败)时正确接听,您需要实施身份验证状态侦听器,如 [=16] 文档中的第一个片段所示=]:
FirebaseAuth.instance
.authStateChanges()
.listen((User? user) {
if (user != null) {
print(user.uid);
}
});
因此您可以 listen
进入身份验证状态,或者您可以将其包装在 build
方法中的 StreamBuilder
中,让您的 UI 响应所有身份验证状态变化。