gre*_*qrl 5 lambda android function kotlin
我正在使用 Kotlin(用于 Android 开发)并且我正在尝试将一个函数传递给另一个我想用作回调的函数。代码非常基础,因为这只是现在的测试。
请注意,虽然您可能想知道为什么我使用这样的回调,但它只是为了测试目的。在我的实际应用程序中,我希望将回调分配给一个值,并在异步方法完成后稍后调用它。
我不能使用协程等......因为此代码将用于多平台解决方案,因此我对制作函数回调感兴趣。
我的 Kotlin 类将接收函数(回调)
class SampleApi {
private var counter: Int = 0
fun startCounting(initialValue: Int, counterCallBack: (resultVal: Int) -> Unit) {
counter = initialValue
counter++
counterCallBack(counter)
}
}
Run Code Online (Sandbox Code Playgroud)
上面是一个基本类,它有一个函数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()
}
}
Run Code Online (Sandbox Code Playgroud)
上面显示的示例代码包含回调方法(期望接收一个整数),并包含从期望接收函数的 SampleApi 类对 startCounting 方法的调用。
我遇到的问题是这一行:
sampleApi.startCounting(5, {counterCallBack()})
Run Code Online (Sandbox Code Playgroud)
Android Studio 中的错误是由于一个值是该函数需要一个整数,因此我收到错误:
No value passed for parameter 'counter'
Run Code Online (Sandbox Code Playgroud)
我试图查看 lambda,但认为这不是问题所在。我已经搜索过这个问题的答案是否已经存在,虽然有帮助,但他们似乎没有考虑与我的用例相同的用例。
对此的任何帮助将不胜感激。
我假设您想要做的是创建一个 toast,显示Int
每次从 调用回调 lamda 时的内容SampleApi
。你只需要利用Int
你的amba被调用,使用it
:
sampleApi.startCounting(5, {counterCallBack(it)})
Run Code Online (Sandbox Code Playgroud)
因为counterCallback
正好有你需要的类型,你也可以使用函数引用而不是 lambda:
sampleApi.startCounting(5, ::counterCallBack)
Run Code Online (Sandbox Code Playgroud)