![](/img/trans.png)
[英]How to make an emit from another function in a flow after flow.stateIn()?
[英]Flow.stateIn() not receiving new value from it's source
我嘗試使用stateIn
將多個SharedFlow
合並為一個StateFlow
。 但是在我向它的SharedFlow
源發出新值后,我的StateFlow
似乎沒有更新。 我發現問題出在我使用stateIn
的方式上。
這是我使用的簡化代碼(您可以從kotlin playground運行它)。
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
fun main() = runBlocking {
val sourceFlow = MutableSharedFlow<Int>()
val stateFlow = sourceFlow.stateIn(GlobalScope, SharingStarted.Lazily, 0)
val job = launch { stateFlow.collect() }
sourceFlow.emit(99)
println(stateFlow.value)
job.cancel()
}
println(stateFlow.value)
在應該打印99
時打印出0
。 我已經閱讀了有關 stateIn 的文檔,但仍然找不到問題所在。 有人知道我哪里做錯了嗎?
簡短的回答是當發出 99 時沒有收集開始,因此該值被簡單地丟棄。 這是SharedFlow
文檔中描述的無緩沖共享流的預期行為:
使用不帶參數的 MutableSharedFlow() 構造函數 function 創建的共享流的默認實現沒有重放緩存,也沒有額外的緩沖區。 發出對此類共享流的調用會暫停,直到所有訂閱者都收到發出的值,如果沒有訂閱者則立即返回。
sourceFlow
(共享流)上沒有訂閱者的原因是因為您使用SharingStarted.Lazily
在此流上調用stateIn()
:
當第一個訂閱者出現時開始共享並且永不停止
這意味着 state 流的協程僅在第一個訂閱者開始收集 state 流時才開始收集源。 state 流程上沒有訂閱者的原因是因為您的發射在到達發射之前沒有時間調用collect
。
當您調用launch
時,您正在啟動一個異步操作。 launch
中的代碼與其后的代碼同時運行。 由於您在runBlocking
的 scope 中運行此launch
,這意味着它與main
代碼的 rest 在同一線程上運行,這意味着launch
的主體在 main 函數的主體實際掛起之前無法開始運行。 在這里它只在到達emit()
時暫停。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.