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/

相关文章:

kotlin - 值影响后无法智能转换为 'Boolean'

带有 Kotlin 的 Android - 如何使用 HttpUrlConnection

android - Jetpack Compose 中的 super.onbackpressed()

android - Jetpack Compose RememberSwipeableState 回收问题

java - 静态快捷方式android不出现

android - Kotlin 数组中的所有项始终包含最后一项

android - Jetpack Compose 和 Compose Navigation 如何处理 Android Activity ?

android - android jetpack compose中的 "remember"和 "mutableState"有什么区别?

android - java.lang.IllegalStateException : Function not found androidx. compose.internal.restartableFunctionInstance 错误

kotlin - 将 CSV 解析为 Kotlin 列表