1

我有一个重播值为 1 的 sharedFlow。但是当我试图访问最后一个发出的值时,调用永远不会返回(虽然first()会)。

下面是我的代码:

val game = GameSettingsRepository.gameIdFlow.flatMapLatest { gameId ->
    gameId?.let { gameDataSource.getGame(it) }
        ?: flowOf()
}.shareIn(ProcessLifecycleOwner.get().lifecycleScope, SharingStarted.Eagerly, 1)

getGame()回调流在哪里:

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()

为什么和如何?

4

1 回答 1

4

SharedFlow 是无限的。它永远保持开放,等待未来可能的排放。因此,它没有最后一个元素。

last()函数通过收集整个 Flow 然后返回最后一个结果来工作。由于collect()在 SharedFlow 上调用时永远不会返回,last()因此也永远不会返回。它将永远暂停。

于 2022-01-26T19:55:14.137 回答