使用Kotlin传递函数

wrrgggsh  于 2023-11-21  发布在  Kotlin
关注(0)|答案(1)|浏览(187)

我在一个正在构建的项目中使用Jetpack Compose for Android Native和Kotlin。我遇到了一个我不太理解的Kotlin问题。我不认为这个问题与Jetpack有任何关系,我认为它与Kotlin更相关。
我试图构建一个通用组件,它可以用于同一个超类的子类的所有不同对象。其中一些对象添加了字段和行为。所以我试图传入不同的函数来处理差异。
下面是我的组件的函数签名:

fun TwistyCard(
    cardItem: CardItem,
    childItemList: CardItemList? = null,
    triggerRerenderFunc: () -> Unit = {},
    checkedFunc: () -> Boolean = { false },
    clickExpandFunc: (CardItem, CardItemList?) -> Unit = {
        cardItemToExpand: CardItem, cardItemListToExpand: CardItemList? ->
    },
) {

字符串
我希望能够通过函数clickExpandFunc调用TwistyCard,我将向该函数传递CardItemCardItemList对象。
首先我不明白的是为什么我不能将函数初始化为{},因为对于大多数CardItem类型,这个函数都不会被使用。它迫使我输入我上面所拥有的来摆脱语法错误。我不认为这是一个大问题,但这是我显然不明白的事情。
稍后在TwistyCard中,我将这样调用这个函数:

clickExpandFunc(cardItem, childItemList)


当我试图从其他组件中使用它时,我的问题就出现了。下面是我的clickExpandFunc实现:

fun clickExpand(cardItem: CardItem, cardItemList: CardItemList?) {
    if (CardItemList.isEmpty(cardItemList)) {
        return
    }
    val locationType = (cardItemList!!.itemList.first() as Location).type
…
}


我调用TwistyCard,传入上面的函数:

TwistyCard(
    cardItem = game,
    childItemList = childItemList,
    triggerRerenderFunc = { locationViewModel.triggerLocationListUpdate(true) },
    checkedFunc = { areAllLocationsForGameChosen(gameName, locationType) },
    clickExpandFunc = { clickExpand(game, childItemList) },     <<<<< SYNTAX ERROR HERE
)


然而,上面的代码给了我一个语法错误:

Expected 2 parameters of types CardItem, CardItemList?
Type mismatch: inferred type is () -> Unit but (CardItem, CardItemList?) -> Unit was expected


我不明白为什么它认为我传入了() -> Unit。这对我来说毫无意义。我需要做什么修改才能使它工作?

fivyi3re

fivyi3re1#

这两种情况的原因是一样的。如果我们定义一个lambda而不指定它的参数,这意味着它要么是无参数的,要么它接受一个参数。在你的例子中,我们需要一个接受两个参数的lambda,所以我们不能定义它为{}{ /* body */ }。我们需要指定它的参数:{ p1, p2 -> /* body */ }
在第一种情况下,你可以使用_,这意味着忽略参数:

clickExpandFunc: (CardItem, CardItemList?) -> Unit = { _, _ -> }

字符串
在第二种情况下,你需要正确地接收和传递参数:

clickExpandFunc = { cardItem, cardItemList -> clickExpand(cardItem, childItemList) },


您可以将此特定情况简化为:

clickExpandFunc = ::clickExpand

相关问题