Firebase AuthInstance.currentUser 成功重新加载后为空

Posted

技术标签:

【中文标题】Firebase AuthInstance.currentUser 成功重新加载后为空【英文标题】:Firebase AuthInstance.currentUser is null after successfully reload 【发布时间】:2018-10-20 10:37:41 【问题描述】:

目前,我的一些用户使用电子邮件和密码登录时遇到了问题。情况是,在发送验证电子邮件后,我在当前的 FirebaseUser 中调用 reload 以更新 currentUser 以了解电子邮件是否已通过验证。

此时一切正常。问题是,有时在FirebaseAuth.currentUser.reload() 的实例上调用reload 后,在reload 的成功回调上,我试图再次访问已经更新的FirebaseAuth.currentUser 实例,有趣的是它来了为空,我得到一个 NPE,当用户成功重新加载并且实例应该被更新,而不是被删除时。

这是我现在的代码:

 override fun verifyUser() 
        if (authInstance.currentUser == null) 
            dispatcher.dispatchOnUi(VerifyUserEmailCompleteAction(requestState = requestFailure(FirebaseUserNotFound()),
                    verified = false))
            return
        
        RxFirebaseUser.reload(authInstance.currentUser!!)
                .subscribeOn(Schedulers.io())
                .subscribe(
                    dispatcher.dispatchOnUi(VerifyUserEmailCompleteAction(requestState = requestSuccess(),
                            verified = authInstance.currentUser!!.isEmailVerified))
                ,  error ->
                    dispatcher.dispatchOnUi(VerifyUserEmailCompleteAction(requestState = requestFailure(error),
                            verified = false))
                )
    

RxFirebase 调用是 Firebase 上的反应式包装器,但我也使用库的正常 Promise 尝试了此代码,并且此错误也发生了。

我的 NPE 即将启动 verified= authInstance.currentUser!!.isEmailVerified,这应该是不可能的,因为我在开始此呼叫之前已经进行了检查,并且 reload 呼叫已成功。

有人遇到过这个问题,知道为什么会这样吗?如何解决它?我可以在那里控制 NPE,但如果重新加载成功,我想在我的应用数据中更新我的用户,而不是发送空实例。

【问题讨论】:

【参考方案1】:

authInstance.currentUser 有时需要一些时间才能更新。您可以将您的reload 调用移动到observeOn 上的主线程,以便为authInstance 提供更多更新时间,并且以防万一在您的代码中添加retry 子句。应该是这样的:

RxFirebaseUser.reload(authInstance.currentUser!!)
            .subscribeOn(Schedulers.io())
            .repeatUntil  authInstance.currentUser != null 
            .defaultTimeout()
            .subscribe(
                val user = authInstance.currentUser
                val emailVerified = user?.isEmailVerified ?: false
                dispatcher.dispatchOnUi(VerifyUserEmailCompleteAction(requestState = if (user == null) requestRunning() else requestSuccess(),
                        verified = emailVerified))
            ,  error ->
                dispatcher.dispatchOnUi(VerifyUserEmailCompleteAction(requestState = requestFailure(error),
                        verified = false))
            )

【讨论】:

以上是关于Firebase AuthInstance.currentUser 成功重新加载后为空的主要内容,如果未能解决你的问题,请参考以下文章

无法解决:com.google.firebase:firebase-ml-vision:24.1.3;无法解决:com.google.firebase:firebase-core:20.0.2

没有创建 Firebase 应用“[DEFAULT]” - 在 Flutter 和 Firebase 中调用 Firebase.initializeApp()

如何修复 Firebase 9.0 导入错误? “尝试导入错误:‘firebase/app’不包含默认导出(导入为‘firebase’)。”

Firebase 持久化,清除 Firebase 缓存

Firebase 存储不会下载并添加到 firebase 数据库

将 Firebase 身份验证与 Firebase 数据库连接