kotlin - 带注释的可为空类型的条件值声明抛出 'type inference failed'

标签 kotlin android-jetpack-compose

我想有条件地声明 @Composable (() -> Unit)? 类型的值,如下所示:

val myComposable: @Composable (() -> Unit)? = { /* something */ }.takeIf { condition }

原因是因为我想将 Compose 的 ListItemsecondaryText 参数一起使用:

// Jetpack compose component
@Composable
fun ListItem(
  secondaryText: @Composable (() -> Unit)? = null,
  // ...
)
// My Usage
ListItem(
  secondaryText = { /* something */ }.takeIf { condition == true }
)

但事实证明这样做会引发以下错误:

Type inference failed. Expected type mismatch: inferred type is (() -> Unit)? but @Composable() (() -> Unit)? was expected

我后来意识到这段代码可以编译:

val secondaryText: @Composable (() -> Unit)? = if (condition) {
  null
} else {
  { /* something */ }
}

这两个声明有什么区别?为什么前者会导致类型推断失败?

最佳答案

当您执行 {/* Something */} 时,您将创建一个类型为 () -> Unit 的值。添加 .takeIf { condition } 会将类型更改为 (() -> Unit)?。没有任何信息表明这是一个 @Composable

这就是您的第二种方法有效的原因:您已指定要创建一个 @Composable

您可以通过明确声明您正在使用 @Composable 来解决此问题:

ListItem(
    secondaryText = (@Composable { /* something */ }).takeIf { condition }
)

关于kotlin - 带注释的可为空类型的条件值声明抛出 'type inference failed',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66224561/

相关文章:

android - Jetpack Compose Navigation 无限加载屏幕

java - 在 Kotlin 中实现 (/inherit/~extend) 注解

android - 从Fragment返回时,多次调用Kotlin ViewModel onchange(使用Lifecycle实现)

android - 插件 ID 包含无效字符 ':'(只有 ASCII 字母数字字符、 '.'、 '_' 和 '-' 字符是有效的 JETPACK COMPOSE

android - 如何在android Jetpack Compose中删除文本?

android - 修饰符工厂函数不应标记为@Composable

android - 如何将按钮中的图标向左对齐并保持文本居中

java - 我如何在 Micronaut/Kotest/Hibernate 测试中出现 "obtain transaction-synchronized Session for current thread"

swift - Swift 中的 Kotlin 枚举类

android - 升级新的 Google Play 控制台对应用程序的许可证 key 有效 在 Play 控制台中可用