首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于接收器类型不匹配,下列任何候选人都不适用

由于接收器类型不匹配,下列任何候选人都不适用
EN

Stack Overflow用户
提问于 2021-07-20 01:03:35
回答 1查看 3.9K关注 0票数 1

我正在迁移一个旧的Android代码库。对于上述代码,我将得到下面的错误。这个问题的原因是什么?我们怎样才能轻易解决这个问题?

代码语言:javascript
复制
    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 -> { }

    }
代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-20 03:36:42

此错误是由于actor函数的签名更改造成的,该函数现在被定义为CoroutineScope上的一个扩展。

代码语言:javascript
复制
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>

因此,您需要使用一些作用域(根据用例使用的作用域)来调用它,从ActivityFragment可以使用lifecycleScope,从ViewModel可以使用viewModelScope,或者如果您不希望取消应用程序的coroutine,则可以使用GlobalScope。所以电话看起来就像

代码语言:javascript
复制
yourScopeChoice.actor<FunAction>(Dispatchers.Main, Channel.CONFLATED)

请注意

actor函数被标记为@ObsoleteCoroutinesApi

这意味着

/** *标记声明是coroutines中的过时的,这意味着相应的*声明的设计存在严重的已知缺陷,它们将来将被重新设计。*粗略地说,这些声明将来将被取消,但目前还没有替代的办法。*因此,不能立即废除这些声明。*/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68448479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档