Firebase Auth authStateChanges 触发器

时间:2021-03-27 15:17:22

标签: firebase dart google-cloud-firestore firebase-authentication

我正在使用 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

我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

<块引用>

我希望在我的方法 createUserInDatabaseIfNew 运行后触发 _firebaseAuth.authStateChanges()

当用户的身份验证状态更改时,即他们的登录完成时,将触发身份验证状态更改侦听器。没有办法改变这种行为,也不应该这样做。

如果您想在用户在您的应用中注册完成时触发,您应该响应发出该信号的事件。因此,如果注册意味着用户被写入数据库,您可以使用数据库上的 onSnapshot 侦听器来检测用户注册。

您甚至可以将两者结合起来:

  1. 使用身份验证状态更改侦听器检测登录何时完成。
  2. 在该身份验证状态侦听器中,然后为用户的注册文档附加一个快照侦听器。