Функция передачи котлина в качестве аргумента получила Несоответствие типов, Обязательный: () -> Единица, Найдено: Единица - PullRequest
0 голосов
/ 05 октября 2018

Наличие функции, которая принимает тип функции для обратного вызова

fun dataBtnClickHandler(callbackFunc: () -> Unit){

    // do something
    ......

    // call the callback function
    callbackFunc     
}

И есть функция, определенная как

private fun lunchStartActivity() {
    val intent = Intent(this, StartActivity::class.java)
    val bundle = Bundle()
    bundle.putInt(FRAGMENT_PREFERENCE, fragmentPreference)
    intent.putExtras(bundle)
    startActivity(intent)
}

, в переключателе щелчка она вызывает dataBtnClickHandler и передаетlunchStartActivity() для обратного вызова.

Но он получает ошибку: Type mismatch, Required: ()->Unit, Found: Unit, что означает ошибка?

when (clickedId) {
   R.id.data_btn -> dataBtnClickHandler(lunchStartActivity())  //<=== Error:  Type mismatch, Required: ()->Unit, Found: Unit

1 Ответ

0 голосов
/ 05 октября 2018

Ваш метод ожидает аргумент функции, который возвращает единицу.

callbackFunc: // Name with a type that is
    () // a 0 arg function
    -> Unit // that returns Unit (AKA void, or nothing) 

Если вы передадите вызов метода напрямую, вы передадите методу аргумент, состоящий из возвращаемого типа.То, как вы изначально это делали, передавало Unit методу.

Чтобы передать в качестве аргумента фактический метод, а не только тип возврата из вызова, вы используете :::

dataBtnClickHandler(::launchStartActivity)

В качестве альтернативы this::launchStartActivity, если он находится в текущемобъект / класс, или замените this именем класса (или именем файла, если это функция верхнего уровня).Хотя :: работает в большинстве случаев.

Помните;здесь вы передаете ссылку на метод, а не результат вызова метода или переменную.

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