如何轻松获取喜马拉雅音频资源?这5个功能让你告别在线播放限制
2026/6/5 18:24:37
您说得非常对!您的直觉是正确的。Compose 确实有类似 Kotlin 集合的可变/不可变概念,但是实现方式不同。
// Kotlin 集合valimmutableList:List<String>=listOf("A","B")// 只读valmutableList:MutableList<String>=mutableListOf("A","B")// 可修改// Compose 状态(类似但不同)valreadOnlyState:State<Int>=...// 只读状态接口valmutableState:MutableState<Int>=...// 可变状态接口State<T>接口(只读)// State 接口定义(简化版)interfaceState<outT>{valvalue:T// 只读属性}MutableState<T>接口(可变)// MutableState 接口定义(简化版)interfaceMutableState<T>:State<T>{overridevarvalue:T// 可写属性}虽然 Compose 没有stateOf()函数,但有多种方式创建只读状态:
val+mutableStateOf@ComposablefunReadOnlyExample1(){// 创建只读状态(对组件内部)valcounter:State<Int>=remember{mutableStateOf(0)}// 使用Text("Count:${counter.value}")// ✅ 可以读取// counter.value = 5 // ❌ 编译错误(虽然是 MutableState,但用 val 声明)}@ComposablefunParent(){varcounterbyremember{mutableStateOf(0)}// 传递给子组件时是只读的 State<Int>Child(counter=counter)}@ComposablefunChild(counter:State<Int>){// 这里 counter 是只读的Text("Count:${counter.value}")}derivedStateOf(计算状态)@ComposablefunDerivedExample(){varinputbyremember{mutableStateOf("")}// 派生状态是只读的 State<Boolean>valisValid:State<Boolean>=remember{derivedStateOf{input.length>5}}Text("Valid:${isValid.value}")}@ComposablefunStateComparison(){// ========== 可变状态 ==========// 方式1:使用 var + by(最常用)varmutable1byremember{mutableStateOf(0)}// 方式2:显式 MutableState 类型valmutable2:MutableState<Int>=remember{mutableStateOf(0)}// 方式3:类型化版本varmutable3byremember{mutableIntStateOf(0)}// ========== 只读状态 ==========// 方式1:用 val 声明(对当前组件只读)valreadOnly1:State<Int>=remember{mutableStateOf(0)}// 方式2:派生状态valreadOnly2:State<Int>=remember{derivedStateOf{mutable1*2}}// 方式3:从参数获得// @Composable fun Child(state: State<Int>)}// 可变状态使用mutable1=10// ✅ 直接赋值mutable2.value=20// ✅ 通过 .value 赋值mutable3=30// ✅ 直接赋值// 只读状态使用valvalue1=readOnly1.value// ✅ 只能读取valvalue2=readOnly2.value// ✅ 只能读取// readOnly1.value = 40 // ❌ 编译错误mutableStateOf@ComposablefunCounterScreen(){// 在父组件中是可变的varcountbyremember{mutableStateOf(0)}Column{// 传递给按钮组件时是只读的CounterDisplay(count=count)// 传递给控制组件时是可变的CounterControls(count=count,onCountChange={count=it})}}// 只读展示组件@ComposablefunCounterDisplay(count:Int){Text("Count:$count")}// 可变控制组件@ComposablefunCounterControls(count:MutableState<Int>,// 或者用回调函数方式onCountChange:(Int)->Unit){Button(onClick={onCountChange(count+1)}){Text("Increment")}}@ComposablefunStateVsFlow(){// Compose 状态(同步,直接)varcomposeStatebyremember{mutableStateOf(0)}// Flow(异步,需要收集)valflowStatebyflow.collectAsState(initial=0)// LiveData(需要转换)valliveDataStatebyliveData.observeAsState()// 它们都实现了 State<T> 接口!valanyState:State<Int>=composeState// 实际上需要包装}// 组件内部管理状态时@ComposablefunMyComponent(){varisExpandedbyremember{mutableStateOf(false)}// ✅vartextbyremember{mutableStateOf("")}// ✅}// 1. 从父组件接收状态@ComposablefunChild(isVisible:Boolean,text:String)// 基本类型参数// 2. 或接收 State 对象@ComposablefunChild(state:State<Data>)// 复杂对象// 3. 派生计算状态@ComposablefunExample(){varinputbyremember{mutableStateOf("")}valisValid=input.length>5// 不需要 State,每次重组计算valcharCountbyremember{derivedStateOf{input.length}}// 需要缓存时}您的感觉是对的!Compose 确实有类似 Kotlin 集合的可变/不可变概念:
| Kotlin 集合 | Compose 状态 | 说明 |
|---|---|---|
List<T> | State<T> | 只读接口 |
MutableList<T> | MutableState<T> | 可变接口 |
listOf() | 没有直接对应 | 需要其他方式创建只读状态 |
mutableListOf() | mutableStateOf() | 创建可变状态 |
关键区别:
listOf()和mutableListOf()是两个不同的函数mutableStateOf()一个创建函数,通过接口类型和声明方式(val/var)控制可变性简单记忆:
var x by mutableStateOf()val x: State<T> = ...或基本类型参数MutableState就像 Kotlin 的MutableList,而State就像List