OnCompleteListener запускает после оператора возврата - PullRequest
0 голосов
/ 10 января 2020

Я хочу использовать проверку подлинности с помощью firebase в шаблоне MVVM, и я возился с ViewModels и LiveData, чтобы попытаться понять, как это работает.

Я изо всех сил пытаюсь понять, почему происходит следующее:

В моем хранилище Я пытаюсь войти в систему с помощью электронной почты и пароля и просто возвращаю String в зависимости от результата (в конце концов я изменю это на пользовательский объект)

        fun loginUser (email: String, password: String): String {
        firebaseAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener{ authTask ->
            if (authTask.isSuccessful) {
                randomString = "Signed in!!"

            } else randomString = "Sign in failed!"  // 2. This happens after randomString is returned
        }
        return randomString // 1. Returns this first, so returning default value
    }

Так что я ожидал, что это вернет либо "Signed in !!" или "Войти не удалось!" но randomString является значением по умолчанию и обновляется , после оно возвращается ..

1 Ответ

4 голосов
/ 10 января 2020

signInWithEmailAndPassword является асинхронным и немедленно возвращает объект Task. Когда вы добавляете слушателя к нему, этот обратный вызов будет вызван через некоторое время после завершения операции. Ваш оператор return фактически возвращает начальное значение randomString до того, как станет доступен результат входа в систему.

Что вы должны сделать вместо этого, если вы используете Android компоненты Jetpack, это возврат ваша собственная реализация LiveData, которая выдает результат входа, когда он завершается. Вызывающий может наблюдать эти LiveData с их собственным обратным вызовом, чтобы узнать, когда это будет сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...