【问题标题】:Flutter Firebase Authentication currentUser() returns nullFlutter Firebase 身份验证 currentUser() 返回 null
【发布时间】:2018-10-30 12:46:08
【问题描述】:

这是关于 Flutter Firebase 身份验证插件的。
我正在尝试在创建新用户后发送验证电子邮件,但 sendEmailVerification() 内部使用 currentUser()。这对我来说似乎是一个错误,但以防万一,我向stackoverflow发布了一个问题。 Android 和 IOS 的错误是一样的。

前两行返回 FirebaseUser。第三个返回 null。第四,如果对第三个进行注释,则会引发空引用错误。

谢谢,
鲍里斯

user = await _auth.createUserWithEmailAndPassword(email: email, password: password); 
// result is FirebaseUser
user = await _auth.signInWithEmailAndPassword(email: email, password: password);
// result is FirebaseUser    
user = await _auth.currentUser();
// result is null    
await user.sendEmailVerification();
//null reference, because it internally uses .currentUser()

【问题讨论】:

    标签: firebase dart firebase-authentication flutter


    【解决方案1】:

    这是我发现的,我不确定它是否仍然是一个错误,但有一种方法可以让它工作。 由 signInWithEmailAndPassword 返回的 FirebaseUser 并未真正经过身份验证。只有 onAuthStateChanged 流返回的用户是。 因此,如果您从 onAuthStateChanged 上下文中调用 user.sendEmailVerification(),那么一切都很好。

    这将起作用:

    _firebaseUserChanged = _auth.onAuthStateChanged.listen((FirebaseUser user) {
        if (user != null && !user.isEmailVerified) {
            user.sendEmailVerification(); 
       }
    });
    

    当然,这段代码是简化的。我们不想在每次登录尝试时都发送验证电子邮件。

    【讨论】:

      【解决方案2】:

      查看firebase_auth 代码,我看到signInWithEmailAndPassword 确实实例化并返回了一个用户。这可能就是您需要调用sendEmailVerification 的用户。

      final user = await _auth.signInWithEmailAndPassword(email: email, password: password);
      await user.sendEmailVerification();
      

      【讨论】:

      • 这正是我在我的问题中写的。它确实会返回 FirebaseUser,但是一旦您对其调用 sendEmailVerification(),调用就会失败。
      • 这看起来很奇怪。查看 java 插件,它确实调用了firebaseAuth.signInWithEmailAndPassword,这意味着应该设置currentUser,除非登录出现问题。您确定用户存在并且电子邮件/密码正确吗?
      • 如果您在 Firebase 中有一个现有用户,并且在使用正确的凭据调用 _auth.signInWithEmailAndPassword 后,_auth.currentUser 返回 null,这是一个错误。
      • 是的,我通过 signInWithEmailAndPassword 进行身份验证并找回 FirebaseUser 没有问题。我认为这一定是一个错误。
      【解决方案3】:

      如果重新加载返回的 FirebaseUser 会怎样?这对我有用。

      const User currentUser = await auth.currentUser;
      if (currentUser != null) {
        await currentUser.reload();
      }
      

      明显简化的代码。 注意:auth.currentUser() 现在是 auth.currentUser。

      【讨论】:

        猜你喜欢
        • 2020-06-24
        • 2021-09-27
        • 2019-01-05
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 2021-04-10
        • 2021-08-23
        • 1970-01-01
        相关资源
        最近更新 更多