Firebase AuthInstance.currentUser является нулевым после успешной перезагрузки - PullRequest
0 голосов
/ 10 мая 2018

У меня сейчас проблема с некоторыми из моих пользователей, которые входят в систему с помощью электронной почты и пароля. Дело в том, что после отправки подтверждающего электронного письма я звоню reload в моем текущем FirebaseUser, чтобы обновить currentUser и узнать, было ли подтверждено письмо или нет.

На данный момент все работает нормально. Дело в том, что иногда после вызова reload над экземпляром FirebaseAuth.currentUser.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 является оберткой Reactive поверх Firebase, но я пробовал этот код также с использованием обычной Promise библиотеки, и эта ошибка также происходит.

Мой NPE приходит на verified= authInstance.currentUser!!.isEmailVerified, что не должно быть возможно, потому что я уже проверил проверку перед началом этого вызова, и вызов reload был успешным.

Кто-то страдал от этой проблемы и знает, почему это может происходить? Как можно обойти это? Я мог бы управлять NPE там, но если перезагрузка прошла успешно, я хочу обновить моего пользователя в данных моего приложения, а не отправлять нулевой экземпляр.

1 Ответ

0 голосов
/ 31 мая 2018

Для обновления 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))
            })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...