如何封装Android Coroutine Actor并仍然将其与viewModelScope相关联

Hec*_*tor 6 android kotlin-coroutines

我正在我当前的 Android 项目中研究 Kotlin Coroutine Actors。

目前我有以下课程

信使:

import kotlinx.coroutines.channels.SendChannel
import org.research.development.intentions.action.Sendable

class Messenger<T>(private val sendChannel: SendChannel<T>) : Sendable<T> {

    override suspend fun send(message: T) {
        sendChannel.send(message)
    }
}
Run Code Online (Sandbox Code Playgroud)

视图模型

abstract class BaseViewModel<I, S>(initialState: S) : ViewModel(), ViewModelable<I, S> {

    private val sendChannel: SendChannel<I> = viewModelScope.actor {
        for (message in channel) {
            dispatch(message)
        }
    }

    protected val internalStateFlow = MutableStateFlow(initialState)
    val stateFlow: StateFlow<S>
        get() = internalStateFlow

    private val messenger: Sendable<I> = Messenger(sendChannel)

    override fun send(message: I) {
        viewModelScope.launch(Dispatchers.IO) {
            messenger.send(message)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要的是在我的 Messenger 类中声明 Actors sendChannel

    import kotlinx.coroutines.channels.SendChannel
    import org.research.development.intentions.action.Sendable
    
    class Messenger<T>() : Sendable<T> {

        private val sendChannel: SendChannel<I> = actor { // viewModelScope????
            for (message in channel) {
                dispatch(message) // HOW DO I CALL THIS METHOD????
            }
        }
    
        override suspend fun send(message: T) {
            sendChannel.send(message)
        }
    }
Run Code Online (Sandbox Code Playgroud)

然而这给我带来了两个问题

1). My Actor is no longer within my ViewModelScope
2). How do I call the ViewModel Dispatch method
Run Code Online (Sandbox Code Playgroud)

解决问题2)。我可以将 dispatch 函数传递给我的 Messenger 类

我如何将演员与我的 ViewModelScope 相关联?

这整个方法有任何价值吗?

iam*_*sal 2

您可以传递viewmodelScopeMessenger 类并从该范围调用参与者。

private val sendChannel: SendChannel<I> = viewModelScope.actor {
    for (message in channel) {
        dispatch(message) 
    }
}
Run Code Online (Sandbox Code Playgroud)

你也可以覆盖 coroutineContext (我认为 Sendable 是 CoroutineScope 的子类)

  override val coroutineContext: CoroutineContext
    get() = viewModelScope.coroutineContext
Run Code Online (Sandbox Code Playgroud)