Передача функции, которая требует параметров в качестве обратного вызова в Kotlin - PullRequest
2 голосов
/ 05 июля 2019

Я использую Kotlin (для разработки под Android) и пытаюсь передать функцию другой функции, которую я хотел бы использовать в качестве обратного вызова.Код очень простой, так как пока это просто тест.

Обратите внимание, что, хотя вы, вероятно, удивитесь, почему я использую такой обратный вызов, он предназначен только для тестирования.В моем реальном приложении я хотел бы присвоить обратный вызов значению и вызвать его позже, как только асинхронный метод завершится.

Я не могу использовать сопрограммы и т. Д., Поскольку этот код будет использоваться для многоплатформенного решения, поэтому я заинтересован в создании функции обратного вызова.

Мой класс Kotlinкоторая получит функцию (обратный вызов)

class SampleApi {
    private var counter: Int = 0

    fun startCounting(initialValue: Int, counterCallBack: (resultVal: Int) -> Unit) {
        counter = initialValue

        counter++

        counterCallBack(counter)
    }
}

Выше приведен базовый класс, имеющий функцию startCounting , которая получит целое число и функцию.Затем она вызовет эту функцию и передаст значение.

Код вызова

class MainActivity : AppCompatActivity() {

    private val sampleApi: SampleApi = SampleApi()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        sampleApi.startCounting(5, {counterCallBack()})
    }

    private fun counterCallBack(counter: Int) {
        Toast.makeText(this, counter.toString(), Toast.LENGTH_SHORT).show()
    }
}

Пример кода, приведенный выше, содержит метод обратного вызова (который ожидаетполучить целое число) и содержит вызов метода startCounting из класса SampleApi, ожидающего получения функции.

Проблема, с которой я столкнулся, заключается в следующей строке:

sampleApi.startCounting(5, {counterCallBack()})

Ошибкав Android Studio это связано с тем, что значение означает, что функция ожидает целое число, и, следовательно, я получаю сообщение об ошибке:

No value passed for parameter 'counter'

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

Любая помощь с этим будет очень признательна.

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Я предполагаю, что вы хотите создать тост, отображающий Int каждый раз, когда ваш обратный вызов вызывается из SampleApi. Вам просто нужно использовать Int, с которым вызывается ваша ламба, используя it:

   sampleApi.startCounting(5, {counterCallBack(it)})
1 голос
/ 05 июля 2019

Поскольку counterCallback имеет именно тот тип, который вам нужен, вы также можете использовать ссылку на функцию *1003* вместо лямбды:

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