在 Kotlin 中作为回调的传递需要参数的函数

7
我正在使用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表达式,但认为那不是问题所在。我已经搜索过是否有现成的解答,虽然它们很有帮助,但似乎没有考虑到与我的使用情况相同的情况。
非常感谢您提供任何帮助。

你可以在多平台环境中使用协程! - Adam Arold
我之前没有意识到这一点。谢谢,亚当,我会深入研究一下 :) - greysqrl
2个回答

9

由于 counterCallback 恰好具有所需的类型,因此您还可以使用 函数引用 而不是 lambda 表达式:

sampleApi.startCounting(5, ::counterCallBack)

谢谢您。我现在已经更改了我的代码,使用这个代替了。 :) - greysqrl

5
我假设您想要做的是在每次从SampleApi调用回调lambda时显示一个toast,其中包含Int。您只需要使用回调传递的Int,并使用it
   sampleApi.startCounting(5, {counterCallBack(it)})

2
对于这个示例,是的,那就是我想做的全部。非常感谢,我已经进行了更新,解决了我的问题。再次感谢! - greysqrl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接