Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Jetpack Compose应如何引用可组合的高阶函数?_Android_Kotlin_Higher Order Functions_Android Jetpack Compose - Fatal编程技术网

Android Jetpack Compose应如何引用可组合的高阶函数?

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) -&

我正在使用Jetpack Compose版本0.1.0-dev13

我已经编写了一个简单的可组合函数,它使用带有项目列表的。(注意:当使用lambda而不是使用
::
语法的引用时,这将按预期工作)

适配器列表
的签名如下,以供参考:

@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) } )