【问题标题】:None of the following candidates is applicable because of receiver type mismatch由于接收器类型不匹配,以下候选均不适用
【发布时间】:2021-09-27 14:07:31
【问题描述】:

我正在迁移旧的 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


【问题讨论】:

    标签: android kotlin kotlin-coroutines coroutine


    【解决方案1】:

    该错误是因为 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>
    

    所以你需要使用一些范围来调用它,你使用哪个范围取决于用例,从ActivityFragment,你可以使用lifecycleScope,从ViewModel,你可以使用viewModelScope或者你如果您不想取消您的coroutine,则可以使用GlobalScope,除非您的应用程序被终止。所以电话看起来像

    yourScopeChoice.actor<FunAction>(Dispatchers.Main, Channel.CONFLATED)
    

    请注意

    actor 函数由@ObsoleteCoroutinesApi 标记

    意思是

    /** * 标记协程 API 中过时的声明, 这意味着相应 * 声明的设计具有 严重的已知缺陷,它们将在未来重新设计。 * 粗略地说,这些声明将来会被弃用 但是还没有替代它们,*所以它们不能 立即弃用。 */

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-11
      • 1970-01-01
      • 2020-10-18
      • 2019-04-19
      • 2022-06-12
      • 2021-10-21
      • 1970-01-01
      • 2017-04-10
      相关资源
      最近更新 更多