【问题标题】:Passing a function that requires parameters as a callback in Kotlin在 Kotlin 中传递需要参数作为回调的函数
【发布时间】:2019-07-05 10:54:25
【问题描述】:

我正在使用 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,但认为这不是问题所在。我已经搜索过这个问题的答案是否已经存在,虽然有帮助,但他们似乎没有考虑与我相同的用例。

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

【问题讨论】:

  • 您可以在多平台环境中使用协程!
  • 我之前没有意识到这一点。谢谢你,亚当,我会再深入一点:)

标签: android function kotlin lambda


【解决方案1】:

因为counterCallback 正是您需要的类型,所以您也可以使用function reference 代替lambda:

sampleApi.startCounting(5, ::counterCallBack)

【讨论】:

  • 谢谢你。我现在已经改变了我的编码来使用它。 :)
【解决方案2】:

我假设您想要做的是每次从SampleApi 调用回调 lamda 时创建一个显示 Int 的 toast。 你只需要使用 Int 来调用你的lamba,使用it

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

【讨论】:

  • 对于示例,是的,这就是我想做的全部。非常感谢,我已经进行了更新,解决了我的问题。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多