【发布时间】:2021-03-10 02:33:52
【问题描述】:
我正在使用来自 Firebase 的 authStateChanges 流。我有两个视图,一个用于移动设备,另一个用于 Web 应用程序。如果用户未连接、未登录或未通过身份验证,我想将用户重定向到登录屏幕。起初它运行良好,但是当我登录并刷新浏览器时,我加载了登录屏幕大约 1 秒钟,然后 Web 屏幕再次出现。我检查了 print 发生了什么,从我看到的情况来看,authStateChanges 流在 1-2 秒内为空(当登录屏幕出现时),然后在流接收到连接的用户时有一个值。有没有办法检查,或者等到这个身份验证完成后再加载登录屏幕,而它不能加载它?
我的主要组件包含以下 StreamBuilder:
Widget build(BuildContext context) {
final firebaseAuthService = Provider.of<FirebaseAuthService>(context);
return StreamBuilder<User>(
stream: firebaseAuthService.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.active) {
User user = snapshot.data;
if (user == null) {
//first time no connection
return SignIn();
}
if (kIsWeb) {
return WebMain(user: user);
}
// load mobile version
return MobileMain();
}
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
});
}
在这里你可以找到我的 FirebaseAuth 包装类,其中包含来自 firebase 的方法:
class FirebaseAuthService {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
User _user;
bool get isAuthenticated {
return _user == null ? false : true;
}
User get user {
return _user;
}
Future<User> signInWithEmailAndPassword(
String userEmail, String userPassword) async {
return _user = await _firebaseAuth
.signInWithEmailAndPassword(email: userEmail, password: userPassword)
.then((userCredential) => userCredential.user);
}
Stream<User> authStateChanges() {
_user = _firebaseAuth.currentUser;
return _firebaseAuth.authStateChanges();
}
Future<void> signOut() async {
return _firebaseAuth.signOut();
}
}
【问题讨论】:
-
我也遇到过刷新后 FirebaseAuth 状态丢失的问题。我正在使用
firebase_auth: ^3.0.1。这个问题有一个未解决的票:github.com/FirebaseExtended/flutterfire/issues/3356
标签: firebase firebase-authentication flutter-web flutter-provider