使用rememberSaveable时为何能解构出两个不同类型的变量?
核心原理说明
你遇到的解构特性并非来自rememberSaveable,而是来自Compose中State类型的Kotlin解构声明支持,逻辑如下:
- 首先梳理代码执行逻辑
rememberSaveable { ... }的Lambda内部返回的是mutableStateOf(tabContent.first().section)的执行结果,也就是一个State<Sections>类型的实例,所以rememberSaveable最终的返回值就是这个State<Sections>对象,你实际解构的是这个State对象,而非rememberSaveable本身。 - Kotlin解构声明的规则
Kotlin的解构语法val (a,b) = obj本质是自动调用对象的componentN()运算符函数,有多少个componentN函数就能解构出多少个变量。 - Compose对
State<T>的解构扩展
Jetpack Compose给State<T>类预置了两个运算符扩展函数:operator fun <T> State<T>.component1(): T:返回State实例持有的value值,对应你代码里的currentSection,类型为Sectionsoperator fun <T> State<T>.component2(): (T) -> Unit:返回用于修改State持有的value的函数,本质逻辑是{ state.value = it },对应你代码里的updateSection,类型为(Sections) -> Unit
- 为什么只能解构出两个变量
因为Compose仅为State<T>定义了component1、component2两个运算符函数,没有定义component3及更高序号的component函数,所以最多只能解构出两个变量,无法解构出更多类型的变量。
补充说明:你平时常用的var count by rememberSaveable { mutableStateOf(0) }语法是Kotlin的属性委托,调用的是State的getValue、setValue运算符,和解构用的是不同的运算符规则,底层都是操作同一个State实例的value属性。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

