为什么Android Studio中MutableState<Sections>解构变量的类型提示为Sections?
该现象的成因说明
这个是Kotlin解构声明特性 + Jetpack Compose针对MutableState的扩展运算符实现共同导致的,Android Studio的类型提示是准确的,你的认知存在偏差,具体逻辑如下:
- 当你直接将
rememberSaveable { mutableStateOf(tabContent.first().section) }的返回值赋值给a时,返回值本身就是MutableState<Sections>类型,类型提示和实际类型完全匹配。 - 你用到的
val (currentSection, updateSection) = 状态实例是Kotlin的解构声明语法,Kotlin会按照变量的声明顺序,自动调用实例对应的componentN()运算符方法,取方法的返回值赋值给对应位置的变量:- Jetpack Compose官方给
MutableState<T>接口扩展了component1()运算符方法,返回值就是状态容器内存储的T类型值,也就是这里的Sections类型,对应解构的第一个变量currentSection - 同时扩展了
component2()运算符方法,返回值是修改状态的函数类型(T) -> Unit,对应解构的第二个变量updateSection
- Jetpack Compose官方给
- 所以解构得到的
currentSection本身就是Sections类型,而非你以为的MutableState<Sections>类型,本质上它等价于val currentSection = 状态实例.value。
你可以参考Compose的底层扩展实现逻辑来理解:
// MutableState解构扩展的近似源码实现 operator fun <T> MutableState<T>.component1(): T = this.value operator fun <T> MutableState<T>.component2(): (T) -> Unit = { newValue -> this.value = newValue }
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

