Ключевое слово suspend
на getVersionCodeRepo()
не относится к emit(Resource.Success(versionCode!!.toInt()))
, поскольку оно вызывается из лямбды. Поскольку вы не можете изменить addSnapshotListener
, вам потребуется использовать конструктор сопрограмм, такой как launch
, для вызова функции suspend
.
Когда лямбда-функция передается в функцию, объявление ее соответствующий параметр функции определяет, может ли она вызывать функцию приостановки без компоновщика сопрограмм. Например, вот функция, которая принимает параметр функции без аргументов:
fun f(g: () -> Unit)
Если эта функция вызывается так:
f {
// do something
}
все в фигурных скобках выполняется как хотя она находится внутри функции, которая объявлена как
fun g() {
// do something
}
Поскольку g
не объявлено с ключевым словом suspend
, она не может вызвать функцию suspend
без использования компоновщика сопрограмм.
Однако, если f()
объявлено так:
fun f(g: suspend () -> Unit)
и называется так:
f {
// do something
}
все в фигурных скобках выполняется так, как будто оно находится внутри функция, которая объявлена как:
suspend fun g() {
// do something
}
Поскольку g
является объявленным с ключевым словом suspend
, она может вызывать функцию suspend
без используя конструктор сопрограмм.
В случае addEventListener
лямбда вызывается так, как будто она вызывается внутри функции, которая объявлена как:
public abstract void onEvent (T value, FirebaseFirestoreException error)
Поскольку это объявление функции выполняет не иметь ключевое слово suspend
(не может, оно в Java), то Передаваемая ей лямбда-выражение должно использовать конструктор сопрограмм для вызова функции, объявленной с ключевым словом suspend
.