Как вы вызываете функцию приостановки внутри SAM? - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь создать 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
        }
    }
}

Iдумаю, было бы просто, если бы я мог изменить ValueClass, но в этом случае я не могу. Я оборачиваюсь вокруг этого и пытаюсь найти реализации.

По крайней мере из того, что я знаю, одним из решений было бы использовать GlobalScope вот так

class MyClass(private val valueClass: ValueClass) {
    fun listenToValue = flow<String> {
        valueClass.registerListener { value ->
            GlobalScope.launch {
                emit(value)
            }
        }
    }
}

Теперь это работает, но я не хочу использовать GlobalScopeпоскольку я буду использовать viewModelScope, чтобы связать его с жизненным циклом моего приложения.

Есть ли способ обойти это?

Заранее спасибо. Любая помощь будет принята с благодарностью!

...