为什么我不能在 lambda 函数下调用 kotlin 挂起函数

Aun*_*win 10 android kotlin android-livedata kotlin-coroutines

让我从示例代码片段开始

suspend fun executeLive(result: MutableLiveData<Person>) {

    val response = ... //suspend api request

    mediatorLiveData.removeSource(response)

    mediatorLiveData.addSource(response) {
        result.value = sortData(it) // sortData is also suspend function which sortData at Dispatcher.Default
    }

}
Run Code Online (Sandbox Code Playgroud)

在这个例子中,sortData不能调用lambda function(在这种情况下addSource)。而且我已经声明executeLivesuspend,这就是为什么suspendapi 请求可以首先启动。但是sortData函数显示编译时错误

挂起函数只能从协程主体调用

那么我该如何改变我的代码结构来解决这个问题呢?

更新:有没有关于这个的文章?

小智 4

lambda 通常是一个回调函数。回调函数之所以被称为回调函数,是因为我们将一段代码包装在一个函数中,并将其传递给其他人(或其他地方)来执行。这是一种基本的控制反转,其中代码不是由您执行,而是由其他人执行(例如框架)。

例如,当您onClickListener在按钮上设置 a 时,我们不知道它何时会被调用,我们为框架传递一个 lambda,该框架负责处理用户交互以调用指定的操作。

在您的情况下,类似地,挂起函数不会调用sortdata,而是将其传递给mediatorLiveData对象以在其自己的上下文中调用它。您传递的 lambda 没有必要从协程主体中调用,因此这是不允许的。

  • 我只想补充一点,如果“addSource”是一个内联函数(并且它的参数不是“crossinline”),那么它就会起作用,从而保证它在同一范围内调用 lambda。 (3认同)