SharedFlow.last()永远不会返回

3

我有一个replay值为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() 则有。

为什么?如何解决?

1个回答

6

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

last()函数通过收集整个Flow并返回最后一个结果来工作。由于在SharedFlow上调用collect()永远不会返回,last()也永远不能返回。它将永远挂起。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接