类型推断失败:为何无法直接在mutableStateOf中存储@Composable函数?
为什么这段Composable函数赋值代码会报错?
我能正常运行以下代码:
val composeFunction = remember { mutableStateOf ({}) }
也能正常运行这段代码:
val composeFF = @Composable { Text("ABC") } val composeFunction = remember { mutableStateOf (composeFF) }
但无法运行下面这段代码:
val composeFunction = remember { mutableStateOf (@Composable { Text("ABC") }) }
执行时会抛出如下错误:
Internal Error occurred while analyzing this expression
(Please use the "" icon in the bottom-right corner to report this error):jar:file:/Applications/Android%20Studio.app/Contents/lib/platform-impl.jar!/general/error.svg
Type inference failed. Expected type mismatch: inferred type is @Composable () -> Unit but () -> Unit was expected
问题原因
这是Kotlin类型推断在嵌套注解场景下的局限性导致的:
- 直接在
mutableStateOf参数内写@Composable { ... }时,编译器无法将@Composable注解的信息正确传递给mutableStateOf的泛型推断流程,会默认把泛型类型推断为普通的() -> Unit,但实际传入的是带@Composable注解的函数类型,因此出现类型不匹配错误。 - 分开声明变量的方式中,
composeFF的类型被明确推导为@Composable () -> Unit,此时mutableStateOf会基于这个明确的类型推断出正确的泛型参数MutableState<@Composable () -> Unit>,所以能正常编译。
解决方法
可以通过显式指定泛型参数的方式,直接告诉编译器mutableStateOf的目标类型,代码如下:
val composeFunction = remember { mutableStateOf<@Composable () -> Unit>({ Text("ABC") }) }
这样就能避免类型推断错误,让编译器正确识别带@Composable注解的函数类型。
内容的提问来源于stack exchange,提问作者Elye
相关产品推荐
相关产品推荐

