您如何在SAM中调用暂挂函数?

时间:2019-10-07 02:12:01

标签: android kotlin flow kotlin-coroutines

我正在尝试创建一个需要从回调中发出值的Flow,但是由于SAM是常规函数,因此无法调用emit函数

这是库中带有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将其绑定到应用程序的生命周期。

有什么办法可以解决这个问题?

先谢谢了。任何帮助将不胜感激!

0 个答案:

没有答案