【问题标题】:How should a composable higher order function be referenced with Jetpack Compose?Jetpack Compose 应该如何引用可组合的高阶函数?
【发布时间】:2020-06-13 16:29:35
【问题描述】:

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

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

AdapterList(data = items, itemCallback = ::ItemCard)

供参考,AdapterList的签名如下:

@Composable
fun <T> AdapterList(
    data: List<T>,
    modifier: Modifier = Modifier,
    itemCallback: @Composable (T) -> Unit
)

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

ItemCard 函数如下所示:

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

据我了解,ItemCard 函数的签名为@Composable (Item) -&gt; Unit,它应该满足AdapterListitemCallback 参数的类型。

此时 IDE 中没有显示错误。

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

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

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

【问题讨论】:

  • 我也见过这个。我假设这是 Compose 的 Kotlin 编译器插件中的错误/限制。创建可重现的测试用例后,我会在 Kotlinlang Slack 中的 #compose 中提问,如果我们找到解决方案,我会在此处添加答案。
  • 听起来不错,干杯!

标签: android kotlin higher-order-functions android-jetpack-compose


【解决方案1】:

好的,the preliminary analysis 是:这是一个错误。

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

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

【讨论】:

    【解决方案2】:

    你可以使用:

    AdapterList(data = items){ ItemCard(item = it) }
    

    AdapterList(data = items, itemCallback= { ItemCard(it) } )
    

    【讨论】:

    • 谢谢,这是我目前的工作解决方案。但是,难道不能使用可调用的引用吗?使用 IMO 参考表格更简洁,我很想知道为什么不能这样。
    • 等于AdapterList(data = items, itemCallback= { ItemCard(it) } ),其中itemCallback(Item) -&gt; Unit
    • 是的,我很欣赏它们在功能上是等效的,甚至可能在编译器级别。纯粹是代码风格的偏好;乍一看,它更清楚地表明 lambda 中没有做任何额外的工作。如果没有人能告诉我为什么它在这里不起作用,我会在一段时间后接受你的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多