我在一个正在构建的项目中使用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
,我将向该函数传递CardItem
和CardItemList
对象。
首先我不明白的是为什么我不能将函数初始化为{}
,因为对于大多数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
。这对我来说毫无意义。我需要做什么修改才能使它工作?
1条答案
按热度按时间fivyi3re1#
这两种情况的原因是一样的。如果我们定义一个lambda而不指定它的参数,这意味着它要么是无参数的,要么它接受一个参数。在你的例子中,我们需要一个接受两个参数的lambda,所以我们不能定义它为
{}
或{ /* body */ }
。我们需要指定它的参数:{ p1, p2 -> /* body */ }
。在第一种情况下,你可以使用
_
,这意味着忽略参数:字符串
在第二种情况下,你需要正确地接收和传递参数:
型
您可以将此特定情况简化为:
型