Android Jetpack Compose应如何引用可组合的高阶函数?
我正在使用Jetpack Compose版本0.1.0-dev13 我已经编写了一个简单的可组合函数,它使用带有项目列表的。(注意:当使用lambda而不是使用Android Jetpack Compose应如何引用可组合的高阶函数?,android,kotlin,higher-order-functions,android-jetpack-compose,Android,Kotlin,Higher Order Functions,Android Jetpack Compose,我正在使用Jetpack Compose版本0.1.0-dev13 我已经编写了一个简单的可组合函数,它使用带有项目列表的。(注意:当使用lambda而不是使用::语法的引用时,这将按预期工作) 适配器列表的签名如下,以供参考: @Composable fun <T> AdapterList( data: List<T>, modifier: Modifier = Modifier, itemCallback: @Composable (T) -&
::
语法的引用时,这将按预期工作)
适配器列表
的签名如下,以供参考:
@Composable
fun <T> AdapterList(
data: List<T>,
modifier: Modifier = Modifier,
itemCallback: @Composable (T) -> Unit
)
据我所知,ItemCard
函数的签名为@Composable(Item)->Unit
,该签名应满足AdapterList
的itemCallback
参数的类型
此时IDE中不显示任何错误
但是,尝试生成项目时,会显示以下错误:
类型不匹配:推断的类型为KFunction1,但应为(项)->Unit
这两种类型之间的区别是什么?应如何更改ItemCard
(或对它的引用)以满足类型约束?您可以使用:
AdapterList(data = items){ ItemCard(item = it) }
或
好的,是:这是一只虫子
(注:前段中的连接需要Kotlinlang松弛通道)
我为此提交了申请(随后被标记为副本)。因此,在此期间,您必须使用lambda表达式。但是,请密切关注这个问题,因为我们可能会在那里找到解决方法。谢谢,这是我目前正在研究的解决方案。然而,难道不能使用可调用的引用吗?使用IMO的引用形式更简洁,我想知道为什么不可能这样做。它等于
AdapterList(data=items,itemCallback={ItemCard(It)})
,其中itemCallback
是(Item)->Unit
。是的,我很欣赏它们在功能上是等价的,甚至在编译器级别上也是如此。这纯粹是对代码风格的偏好;乍一看,lambda中没有额外的工作。如果没有人能告诉我为什么它不起作用,我会在一段时间后接受你的回答。我也看到了这一点。我假设这是用于Compose的Kotlin编译器插件中的一个缺陷/限制。在我创建了一个可复制的测试用例之后,我将在Kotlinlang Slack中询问#compose
,如果我们找到解决方案,我将在这里添加一个答案。听起来很棒,干杯!
@Composable
private fun ItemCard(item: Item) {
Card(
color = item.type.getColor()
) {
Text(
item.name,
style = MaterialTheme.typography.h5
)
}
}
AdapterList(data = items){ ItemCard(item = it) }
AdapterList(data = items, itemCallback= { ItemCard(it) } )