为什么不能在lambda函数下调用kotlin暂停函数

问题描述 投票:0回答:1

让我从示例代码片段开始

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

        val response = ... //suspend api request

        mediatorLiveData.removeSource(response)

        mediatorLiveData.addSource(response) { it ->

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

}

在此示例中,sortData不能在lambda function下调用(在本例中为addSource)。而且我已经将executeLive声明为suspend,因此为什么suspend api请求可以首先开始。但是sortData函数显示编译时错误

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

因此,如何更改我的代码结构以解决此问题?希望你有个美好的一天。谢谢!

更新:是否有关于此的文章?让我知道。

android kotlin android-livedata kotlin-coroutines
1个回答
0
投票

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

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

在您的情况下,类似地,suspend函数未调用sortdata,而是将其传递给mediatorLiveData对象以在其自身的上下文中对其进行调用。不必从协程体内调用您传递的lambda,因此不允许这样做。

希望此说明有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.