我想有条件地声明一个@Composable (() -> Unit)?
像这样的类型的值:
val myComposable: @Composable (() -> Unit)? = { /* something */ }.takeIf { condition }
原因是因为我想将ComposeListItem
与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 }
)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句