У меня есть функция «A» в ViewModel, которая извлекает данные из firebase, и я присваиваю значение MutableLiveData<Int> (все это заключено в onSuccessListener) и возвращаю его. Эта функция вызывается из другой функции «B» в той же ViewModel. Но когда я пытаюсь вернуть MutableLiveData<Int> из 'A', он возвращается как 0 (значение по умолчанию). Но если я назначу значение для MutableLiveData<Int> вне onSuccessListener, то значение будет возвращено.
Код:
val num = MutableLiveData<Int>().default(0)
private fun A():Int {
FirebaseOperation
.addOnSuccessListener{ //it:DocumentSnapshot!
num.value = it.num
}
return num.value.toInt() // outside onsuccesslistener, default value 0 is being returned
}
private fun B() {
val num2 = A()
}
Обновление: узнав об аде обратного вызова firebase, я переключился на сопрограмму kotlin для firebase (реализовав org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.1.1 как зависимость) Обновленный код:
private suspend fun A():DocumentSnapshot? {
return Firebase.firestore.collection("collection").documet("document").get().await()
}
private suspend fun B(): Int{
val data = A()
val user = data.toObject<User>()
val num = user.num
return num
}
Но основной поток зависает, и приложение вылетает с ошибкой Reason: Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it. Outbound queue length: 0. Wait queue length: 9.).