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

sam*_*dy1 5 android higher-order-functions kotlin android-jetpack-compose

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

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

AdapterList(data = items, itemCallback = ::ItemCard)
Run Code Online (Sandbox Code Playgroud)

作为参考,签名AdapterList如下:

@Composable
fun <T> AdapterList(
    data: List<T>,
    modifier: Modifier = Modifier,
    itemCallback: @Composable (T) -> Unit
)
Run Code Online (Sandbox Code Playgroud)

为了更好地促进单独预览,我将项目回调分解为一个单独的可组合函数。

ItemCard函数如下所示:

@Composable
private fun ItemCard(item: Item) {
    Card(
        color = item.type.getColor()
    ) {
        Text(
            item.name,
            style = MaterialTheme.typography.h5
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

据我了解,该ItemCard函数的签名应满足 的参数@Composable (Item) -> Unit类型。itemCallbackAdapterList

此时 IDE 中没有显示任何错误。

但是,当尝试构建项目时,会显示以下错误:

类型不匹配:推断类型为 KFunction1<Item, Unit> 但预期为 (Item) -> Unit

这两种类型之间有什么区别?应该如何ItemCard更改(或对它的引用)以满足类型约束?

Com*_*are 3

OK,初步分析是:是一个bug。

(注:前段中的链接需要 Kotlinlang Slack 访问权限)

我为此提交了一个问题(随后被标记为该问题的副本)。因此,与此同时,您仍受困于 lambda 表达式。但是,请密切关注该问题,因为我们可能会在那里找到解决方法。