Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 带注释的可空类型的条件值声明抛出';类型推断失败';_Kotlin_Android Jetpack Compose - Fatal编程技术网

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)
)中显式声明,为什么我必须再次键入它?科特林不应该为我推断吗?