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 成功重新加载后为空的主要内容,如果未能解决你的问题,请参考以下文章