SharedFlow.last() никогда не возвращается
У меня есть общий поток со значением воспроизведения, равным единице. Но когда я пытаюсь получить доступ к последнему переданному значению, вызов никогда не возвращается, в то время как first() возвращает. Вот мой код:
val game = GameSettingsRepository.gameIdFlow.flatMapLatest { gameId ->
gameId?.let { gameDataSource.getGame(it) }
?: flowOf()
}.shareIn(ProcessLifecycleOwner.get().lifecycleScope, SharingStarted.Eagerly, 1)
где
getGame()
это callbackFlow :
override fun getGame(gameId: String): Flow<Game> = callbackFlow {
val listener = object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
snapshot.getValue(GameFirebase::class.java)?.let { gameFirebase ->
trySend(gameFirebase.toData())
}
}
}
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
}
db.child(gameId).addValueEventListener(listener)
awaitClose { db.child(gameId).removeEventListener(listener) }
}
и так это:
val myGame = game.last()
никогда ничего не возвращает, пока...
val myGame = game.first()
... делает.
Почему ??
1 ответ
SharedFlow бесконечен. Он остается открытым навсегда в ожидании возможных будущих выбросов. Следовательно, в нем нет последнего элемента.
Функция работает, собирая весь поток, а затем возвращая последний результат. С
collect()
никогда не возвращается при вызове в SharedFlow,
last()
тоже не может вернуться. Он будет приостановлен навсегда.