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()тоже не может вернуться. Он будет приостановлен навсегда.

Другие вопросы по тегам