SharedFlow.last()永远不会返回



我有一个重播值为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) }
}

因此:CCD_ 3从不返回任何内容,而CCD_。

为什么以及如何?

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

last()函数的工作原理是收集整个Flow,然后返回最后的结果。由于在SharedFlow上调用collect()时永远不会返回,因此last()也永远不会返回。它将永远中止。

最新更新