【问题标题】:Firebase AuthInstance.currentUser is null after successfully reloadFirebase AuthInstance.currentUser 成功重新加载后为空
【发布时间】: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,但如果重新加载成功,我想在我的应用数据中更新我的用户,而不是发送空实例。

【问题讨论】:

    标签: android firebase kotlin firebase-authentication


    【解决方案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))
                })
    

    【讨论】:

      猜你喜欢
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2016-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      相关资源
      最近更新 更多