![](/img/trans.png)
[英]How to write an extension function / wrapper for Kotlin Coroutines Flow?
[英]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上的consumeAsFlow或asFlow )。
但是目前 Kotlin 團隊正在開發一個叫做StateFlow
的東西,這在某種程度上是為了實現類似的行為,盡管它什么時候准備好還不得而知。
編輯: StateFlow
和SharedFlow
已作為穩定 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.