簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM