Flow 多次收集时会发出不同的值

Flow emits different values when collecting it multiple times

我创建了一个从中发出数据的流。当我两次收集此流时,同一变量发出了两组不同的数据,而不是向两个收集器发出相同的值。

我有一个自己创建的简单流程。文本将每秒记录两次

    val demoFlow: Flow<String> = flow {
        while (true) {
            val text = "Flow ${(0..100).random()}"
            Log.d("TAG", text)
            emit(text)
            delay(1000)
        }
    }

在我的 viewModel 中,我有一个简单的函数可以获取之前的 Flow

fun getSimpleFlow() = FlowRepository.demoFlow

在我的 Fragment 中,我收集并显示了我的 Flow

        lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                launch {
                    viewModel.getSimpleFlow().collect {
                        binding.tv1.text = it
                    }
                }
                launch {
                    viewModel.getSimpleFlow().collect {
                        binding.tv2.text = it
                    }
                }
            }
        }

如果我将 Flow 转换为 StateFlow 或 SharedFlow,我将不再有此问题。 我不明白为什么会发生这种情况,因为我使用的是相同的 'demoFlow' 变量。 有没有办法在不转换为 StateFlow 或 SharedFlow 的情况下从 'demoFlow' 获取相同的值?

常规 Flow 是冷的,此行为是设计使然。

demoFlow 相同,所以您有相同的 Flow 实例。但是,多次收集流实际上每次都从头开始运行 flow { ... } 定义内的主体。每个独立的集合都有自己的变量i

使用 StateFlowSharedFlow 允许在多个收集器之间共享流源。如果您在某些源流上使用 shareInstateIn,则该源流仅收集一次,并且从此源流收集的项目将共享并发送到结果 state/shared 的每个收集器流动。这就是它表现不同的原因。

简而言之,重用 Flow 个实例不足以共享集合。您需要使用专门为此设计的流类型。