我正在使用 firebase 对用户进行身份验证并在 firestore 数据库中创建一个用户:
final auth.FirebaseAuth _firebaseAuth;
Future<void> signUp(
{@required String email, @required String password}) async {
assert(email != null && password != null);
try {
await _firebaseAuth.createUserWithEmailAndPassword(
email: email, password: password);
await createUserInDatabaseIfNew();
} on Exception {
throw SignUpFailure();
}
}
使用 firebase,一旦方法 .createUserWithEmailAndPassword()
被执行,它会在 authStateChanges
之后立即触发,我在我的代码中使用它在 user
流中发送新用户,并最终从数据库中检索其数据
Stream<User> get user {
return _firebaseAuth.authStateChanges().map((firebaseUser) {
return firebaseUser == null ? User.empty : firebaseUser.toUser;
});
}
StreamSubscription<User> _userSubscription = _authenticationRepository.user.listen((user) {
return add(AuthenticationUserChanged(user));}
if(event is AuthenticationUserChanged){
if(event.user != User.empty){
yield AuthenticationState.fetchingUser();
User userFromDatabase;
try{
var documentSnapshot = await _firebaseUserRepository.getUser(event.user.id);
userFromDatabase = User.fromEntity(UserEntity.fromSnapshot(documentSnapshot));
yield AuthenticationState.authenticated(userFromDatabase);
}
我面临的问题是,由于 _firebaseAuth.createUserWithEmailAndPassword
,_firebaseAuth.authStateChanges
被触发 before 用户在数据库中创建,最终当我尝试检索那个用户,它仍然不存在于数据库中。
我希望在我的方法 _firebaseAuth.authStateChanges()
运行后 触发 createUserInDatabaseIfNew
。
我怎么能做到这一点?
答案 0 :(得分:1)
我希望在我的方法 createUserInDatabaseIfNew 运行后触发 _firebaseAuth.authStateChanges()
。
当用户的身份验证状态更改时,即他们的登录完成时,将触发身份验证状态更改侦听器。没有办法改变这种行为,也不应该这样做。
如果您想在用户在您的应用中注册完成时触发,您应该响应发出该信号的事件。因此,如果注册意味着用户被写入数据库,您可以使用数据库上的 onSnapshot
侦听器来检测用户注册。
您甚至可以将两者结合起来: