簡體   English   中英

如何從不同的 function 發出流量值? Kotlin 協程

[英]How to emit Flow value from different function? Kotlin Coroutines

我有一個流程:

val myflow = kotlinx.coroutines.flow.flow<Message>{}

並想用 function 發出值:

override suspend fun sendMessage(chat: Chat, message: Message) {
    myflow.emit(message)
}

但是編譯器不允許我這樣做,有什么解決方法可以解決這個問題嗎?

Animesh Sahu 的答案非常正確。 您還可以將Channel作為流返回(請參閱BroadcastChannel上的consumeAsFlowasFlow )。

但是目前 Kotlin 團隊正在開發一個叫做StateFlow的東西,這在某種程度上是為了實現類似的行為,盡管它什么時候准備好還不得而知。

編輯: StateFlowSharedFlow已作為穩定 API 的一部分發布( https://blog.jetbrains.com/kotlin/2020/10/kotlinx-coroutines-1-4-0-introducing-stateflow-and-sharedflow/ ) . 當異步執行上下文中需要 state 管理時,可以並且應該使用這些工具。

您可以將StateFlow用於此類用例。 這是一個示例代碼。

import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*

val chatFlow = MutableStateFlow<String>("")

fun main() = runBlocking {

    // Observe values
    val job = launch {
        chatFlow.collect {
            print("$it ")
        }
    }

    // Change values
    arrayOf("Hey", "Hi", "Hello").forEach {
        delay(100)
        sendMessage(it)
    }

    delay(1000)

    // Cancel running job
    job.cancel()
    job.join()
}

suspend fun sendMessage(message: String) {
    chatFlow.value = message
}

您可以通過運行以下代碼段來測試此代碼。

 <iframe src="https://pl.kotl.in/DUBDfUnX3" style="width:600px;"></iframe>

流程是自包含的,一旦流程中的塊(lambda)被執行,流程就結束了,您必須在內部進行操作並從那里發出它們。

這是類似的github 問題,說:

Afaik Flow 被設計成一個獨立的、可重放的、冷的 stream,因此從它自己的 scope 外部排放不會成為合同的一部分。 我認為你正在尋找的是一個頻道。

恕我直言,您可能正在查看Channels ,或者特別是針對多個接收器的ConflatedBroadcastChannel 普通頻道和廣播頻道之間的區別在於,多個接收者可以使用openSubscription function 收聽廣播頻道,它返回與廣播頻道關聯的 ReceiveChannel。

使用SharedStateFlow它擁有你需要的一切。

流程的初始化:

val myFlow = MutableSharedFlow<Message>()

現在它應該像你之前嘗試的那樣工作:

override suspend fun sendMessage(chat: Chat, message: Message) {
    myFlow.emit(message)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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