Firebase асинхронные задачи для сопрограмм - PullRequest
0 голосов
/ 25 марта 2019

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

Это моя приостановка, с помощью которой я достигаю поведения сопрограммы.

suspend fun <T> Task<T>.awaitTask(): T =
    suspendCoroutine { continuation ->
        addOnCompleteListener { task ->
            if (task.isSuccessful) {
                continuation.resume(task.result!!)//what to do if task.result is null
            } else {
                continuation.resumeWithException(task.exception!!)
            }
        }
    }

Вот как я это призываю

firebase.createUserWithEmailAndPassword(userCredentials.email!!, userCredentials.password!!).awaitTask()

Все работает хорошо, пока мы не выполним задачу, которая может иметь нулевой результат. Подобно .

firebase.currentUser?.updateProfile(profileUpdates)?.awaitTask()

Здесь при успешном обновлении task.result имеет значение null. В таком случае, что следует передать в продолжение.resume?.

1 Ответ

1 голос
/ 25 марта 2019

Ваш тип возвращаемого значения должен иметь значение NULL, поскольку Task.getResult() имеет значение NULL:

suspend fun <T> Task<T>.await() : T? = ...

. Если вы используете его для получения результата, который не может иметь значение NULL, то установите принудительное значение NULL на месте использования, а не внутриреализация.

Тем не менее, зачем вам переопределять это, когда оно уже определено в kotlinx-coroutines-play-services?

...