将需要参数的函数作为回调传递给Kotlin

时间:2019-07-05 10:54:25

标签: android function kotlin lambda

我正在使用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()
    }
}

上面显示的示例代码包含回调方法(期望接收一个整数),并包含来自期望接收函数的SampleApi类对startCounting方法的调用。

我的问题是这一行:

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

Android Studio中的错误是由于以下事实造成的:值是函数期望整数,因此我收到错误:

No value passed for parameter 'counter'

我尝试查看lambda,但不认为这是问题所在。我已经搜索过是否存在答案,尽管很有帮助,但他们似乎并没有考虑与我相同的用例。

任何对此的帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我假设您想做的是创建一个吐司,在每次从const StackNavigator = createStackNavigator({ About, MainNavigator }) 调用回调lamda时显示Int。 您只需要使用SampleApi来调用调用您的lamba的Int

it

答案 1 :(得分:1)

由于counterCallback正是您需要的类型,因此您也可以使用function reference而不是lambda:

sampleApi.startCounting(5, ::counterCallBack)