我正在迁移一个旧的Android代码库。对于上述代码,我将得到下面的错误。这个问题的原因是什么?我们怎样才能轻易解决这个问题?
fun action(action: FunAction) = actor.offer(action)
private val actor = actor<FunAction>(Dispatchers.Main, Channel.CONFLATED) {
for (action in this) when (action) {
is FunAction.Init -> { }
is FunAction.SaveUserSetting -> { }
is FunAction.UploadProfilePhoto -> { }
}Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public fun <E> CoroutineScope.actor(context: CoroutineContext = ..., capacity: Int = ...,
start: CoroutineStart = ..., onCompletion: CompletionHandler? /* = ((cause: Throwable?) -> Unit)? */ = ...,
block: suspend ActorScope<TypeVariable(E)>.() -> Unit): SendChannel<TypeVariable(E)>
defined in kotlinx.coroutines.channels发布于 2021-07-20 03:36:42
此错误是由于actor函数的签名更改造成的,该函数现在被定义为CoroutineScope上的一个扩展。
public fun <E> CoroutineScope.actor(
context: CoroutineContext = EmptyCoroutineContext,
capacity: Int = 0, // todo: Maybe Channel.DEFAULT here?
start: CoroutineStart = CoroutineStart.DEFAULT,
onCompletion: CompletionHandler? = null,
block: suspend ActorScope<E>.() -> Unit
): SendChannel<E>因此,您需要使用一些作用域(根据用例使用的作用域)来调用它,从Activity、Fragment可以使用lifecycleScope,从ViewModel可以使用viewModelScope,或者如果您不希望取消应用程序的coroutine,则可以使用GlobalScope。所以电话看起来就像
yourScopeChoice.actor<FunAction>(Dispatchers.Main, Channel.CONFLATED)请注意
actor函数被标记为@ObsoleteCoroutinesApi
这意味着
/** *标记声明是coroutines中的过时的,这意味着相应的*声明的设计存在严重的已知缺陷,它们将来将被重新设计。*粗略地说,这些声明将来将被取消,但目前还没有替代的办法。*因此,不能立即废除这些声明。*/
https://stackoverflow.com/questions/68448479
复制相似问题