Почему я не могу вызвать kotlin приостановить функцию под лямбда-функцией - PullRequest
4 голосов
/ 21 января 2020

Позвольте мне начать с примера фрагментов кода

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
    }

}

В этом примере sortData не может звонить в lambda function (в данном случае addSource). А также я уже объявляю executeLive как suspend, поэтому suspend запрос API может начинаться сначала. Но функция sortData показывает ошибку времени компиляции

Функция приостановки может быть вызвана только из тела сопрограммы

Итак, как мне изменить структуру кода для решения этой проблемы?

Обновление: Есть ли какая-нибудь статья по этому поводу?

1 Ответ

2 голосов
/ 21 января 2020

Лямбда, как правило, является функцией обратного вызова. Функции обратного вызова называются так, потому что мы оборачиваем блок кода в функцию и передаем его кому-то другому (или другому месту) для выполнения. Это базовая c инверсия управления, когда код должен выполнять не вы, а кто-то другой (например, фреймворк).

Например, когда вы устанавливаете onClickListener для кнопки , мы не знаем, когда он будет вызван, мы передаем лямбду для структуры, которая заботится о взаимодействии пользователя, чтобы вызвать указанное действие.

В вашем случае аналогично функция suspend не вызывает sortdata, он передает его объекту mediatorLiveData, чтобы вызвать его в своем собственном контексте. Нет необходимости, чтобы лямбда, которую вы передали, была вызвана из тела сопрограммы, так как это запрещено.

...