我想有条件地声明 @Composable (() -> Unit)?
类型的值,如下所示:
val myComposable: @Composable (() -> Unit)? = { /* something */ }.takeIf { condition }
原因是因为我想将 Compose 的 ListItem
与 secondaryText
参数一起使用:
// 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/