参数数目未知的AndroidKotlin回调

qmb5sa22  于 2022-12-02  发布在  Android
关注(0)|答案(3)|浏览(165)

我创建了一个函数,如下所示:

fun someFunction(
    callBack: () -> Unit
){
    callback.invoke()
}

当我将使用函数:

someFunction(
    callBack = callBackFun()

)

因此,问题是,由于我不知道callBackFun()将有多少个参数(可能是0个或多个),因为someFunction可以在多种情况下使用。我如何创建具有0个或多个参数的回调(vararg在这种情况下不起作用)

nhaq1z21

nhaq1z211#

callBackFun()放在两个花括号{}中,就可以传递任何带有不同参数的函数:

someFunction(
    callBack = { callBackFun() }
)

someFunction(
    callBack = { secondCallBackFun(arg1, arg2) }
)

someFunction(
    callBack = { thirdCallBackFun(arg1, arg2, arg3) }
)

你甚至可以传递多个函数,并在lambda中编写你想要的任何逻辑,就像其他函数一样:

someFunction(
    callBack = { 
        val arg1 = "test"
        val arg2 = "test2"
        val arg3 = 21

        callBackFun()
        secondCallBackFun(arg1, arg2)
        thirdCallBackFun(arg1, arg2, arg3)
    }
)

但是callBack lambda函数的参数应该是已知的,你设置它的类型为:() -> Unit所以它不带任何参数。

6ie5vjzr

6ie5vjzr2#

目前不支持在回调函数中使用vararg,如果愿意,可以使用List

fun someFunction(
    callBack: (args: List<Any>) -> Unit
){
    callback.invoke(listOf<Any>())
}
hgtggwj0

hgtggwj03#

在Kotlin中你可以提供几个lambda函数到带有vararg的高阶函数,这没有问题。例如,像这样:

fun myFunction(vararg func: () -> Unit) {
        //Something to do
}

您可以按如下方式使用它:

myFunction(
  { TODO() }, 
  { TODO() }, 
  { TODO() }, 
)

或者甚至是这样:

myFunction(
  func = arrayOf(
      { TODO() },
      { TODO() },
      { TODO() },
  )
)

UPD:如果要按函数名提供(如下所示:newFun())您还可以考虑以下情况:

myFunction(
    func = arrayOf(
        ::newFun,
        ::newFun2,
        ::newFun3,
    )
)

当然还有:

myFunction(
    ::newFun,
    ::newFun2,
    ::newFun3,
)

相关问题