【发布时间】:2019-10-07 02:12:01
【问题描述】:
我正在尝试创建一个需要从回调中发出值的Flow,但我无法调用emit 函数,因为 SAM 是一个普通函数
这是来自库的带有 SAM 的类,我无法真正按照我需要的方式对其进行修改。
class ValueClass {
fun registerListener(listener: Listener) {
...
}
interface Listener {
fun onNewValue(): String
}
}
这是我对创建 Flow 对象的看法
class MyClass(private val valueClass: ValueClass) {
fun listenToValue = flow<String> {
valueClass.registerListener { value ->
emit(value) // Suspension functions can only be called on coroutine body
}
}
}
我想如果我可以更改 ValueClass 会很简单,但在这种情况下,我不能。我一直在思考这个问题并试图寻找实现。
至少据我目前所知,一种解决方案是像这样使用GlobalScope
class MyClass(private val valueClass: ValueClass) {
fun listenToValue = flow<String> {
valueClass.registerListener { value ->
GlobalScope.launch {
emit(value)
}
}
}
}
现在,这可行,但我不想使用 GlobalScope,因为我将使用 viewModelScope 将其与我的应用程序的生命周期联系起来。
有什么办法可以解决这个问题吗?
提前致谢。任何帮助将不胜感激!
【问题讨论】:
-
天哪,是的!非常感谢!会尝试一下,希望它有效
-
您找到解决方案了吗?我也想知道。
-
我使用
callbackFlow就像@stkent 提到的那样,而不是emit,你offer的价值
标签: android kotlin flow kotlin-coroutines