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
等
使用 StateFlow
或 SharedFlow
允许在多个收集器之间共享流源。如果您在某些源流上使用 shareIn
或 stateIn
,则该源流仅收集一次,并且从此源流收集的项目将共享并发送到结果 state/shared 的每个收集器流动。这就是它表现不同的原因。
简而言之,重用 Flow
个实例不足以共享集合。您需要使用专门为此设计的流类型。
我创建了一个从中发出数据的流。当我两次收集此流时,同一变量发出了两组不同的数据,而不是向两个收集器发出相同的值。
我有一个自己创建的简单流程。文本将每秒记录两次
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
等
使用 StateFlow
或 SharedFlow
允许在多个收集器之间共享流源。如果您在某些源流上使用 shareIn
或 stateIn
,则该源流仅收集一次,并且从此源流收集的项目将共享并发送到结果 state/shared 的每个收集器流动。这就是它表现不同的原因。
简而言之,重用 Flow
个实例不足以共享集合。您需要使用专门为此设计的流类型。