Kotlin 带注释的可空类型的条件值声明抛出';类型推断失败';
我想有条件地声明类型为Kotlin 带注释的可空类型的条件值声明抛出';类型推断失败';,kotlin,android-jetpack-compose,Kotlin,Android Jetpack Compose,我想有条件地声明类型为@Composable(()->Unit)?的值,如下所示: val myComposable:@Composable(()->Unit)?={/*某物*/}.takeIf{condition} 原因是我想将Compose的ListItem与secondaryText参数一起使用: //Jetpack组合组件 @组合的 趣味列表项( secondaryText:@Composable(()->Unit)?=null, // ... ) //我的用法 列表项( secon
@Composable(()->Unit)?
的值,如下所示:
val myComposable:@Composable(()->Unit)?={/*某物*/}.takeIf{condition}
原因是我想将Compose的ListItem
与secondaryText
参数一起使用:
//Jetpack组合组件
@组合的
趣味列表项(
secondaryText:@Composable(()->Unit)?=null,
// ...
)
//我的用法
列表项(
secondaryText={/*something*/}.takeIf{condition==true}
)
但这样做会产生以下错误:
Type inference failed. Expected type mismatch: inferred type is (() -> Unit)? but @Composable() (() -> Unit)? was expected
我后来意识到这段代码编译:
val secondaryText:@Composable(()->Unit)?=如果(条件){
无效的
}否则{
{/*某物*/}
}
这两个声明之间有什么区别?为什么前者会导致类型推断失败?当您执行
{/*something*/}
时,您会创建一个类型为()->Unit
的值。添加.takeIf{condition}
会将类型更改为(()->单位)
。没有信息表明这是一个可组合的@Composable
这就是第二种方法起作用的原因:您已经指定要创建一个@Composable
您可以通过明确声明您正在使用一个@Composable
,来解决这个问题:
ListItem(
secondaryText=(@Composable{/*something*/}).takeIf{condition}
)
谢谢,这是可行的,但我还是不明白为什么它不起作用。注释在ListItem
的secondaryText
参数(secondaryText:@Composable(()->Unit)
)中显式声明,为什么我必须再次键入它?科特林不应该为我推断吗?