Kotlin: Можно ли передать в функцию два 'this'? - PullRequest
1 голос
/ 18 июня 2020

С приведенным ниже кодом я получаю следующую ошибку: «Функция приостановки 'getSomethingFromAPI' должна вызываться только из сопрограммы или другой функции приостановки.», Которая является текущей. getSomethingFromAPI действительно является функцией приостановки ViewModel.

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        viewModel = ViewModelProvider(this).get(CallVM::class.java)

        viewModel.applyLaunch {
            this.getSomethingFromAPI()
        }
    }

   fun <T: ViewModel> T.applyLaunch(block: T.() -> Unit)
           = apply { viewModelScope.launch(Dispatchers.IO) { block() } }

Как вы можете видеть, в функции applelaunch я выполняю getSomethingFromAPI внутри сопрограммы (запуск), но эта информация теряется. Есть ли способ сохранить его и одновременно сохранить T как ViewModel?

Чтобы быть более конкретным, c, возможно ли иметь функцию быстрого доступа, которая реализует две первые строки кода ниже?

        viewModel.apply {
            viewModelScope.launch(Dispatchers.IO) {
                 getSomethingFromAPI()
        }

getSomethingFromAPI выше видит оба 'this' (ViewModel и сопрограмму).

Я знаю, что это не что-то важное, но для создания DSL было бы неплохо знать.

1 Ответ

2 голосов
/ 18 июня 2020

Вы получаете эту ошибку, потому что пытаетесь вызвать функцию приостановки в лямбда-выражении без приостановки. Сделать лямбда в applyLaunch suspend block: suspend T.() -> Unit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...