Kotlin + Compose Flow State 手册
| 概念 | 作用 | 示例 |
|---|---|---|
| MutableStateFlow / StateFlow | 状态流,UI 绑定 | 上面的 Counter 示例 |
| MutableSharedFlow / SharedFlow | 事件流,多收集者 | 上面的 EventLogger 示例 |
| asStateFlow / asSharedFlow | 封装可变流 | 上面封装状态/事件流示例 |
| collectAsState / collectAsStateWithLifecycle | Flow → Compose State | StatusScreen 示例 |
| asFlow | 集合/数组 → Flow | NumberList 示例 |
| remember | Compose 内临时状态 | RememberExample |
| rememberSaveable | 跨配置状态保存 | RememberSaveableExample |
| rememberCoroutineScope | Compose 内协程 | CoroutineExample |
| 名称 | 类型 | 定义 / 作用 | 是否可变 | 用途 / 场景 | 示例 |
|---|---|---|---|---|---|
MutableStateFlow<T> | Flow | 可变状态流,保存单个状态值 | 可变 | ViewModel 内部状态,状态驱动 UI | _uiState = MutableStateFlow(0) |
StateFlow<T> | Flow | 对 MutableStateFlow 的只读封装 | 只读 | 向 UI 暴露状态 | val uiState: StateFlow<Int> = _uiState.asStateFlow() |
MutableSharedFlow<T> | Flow | 可变事件流,发射事件,可被多个收集者收集,可设置 replay | 可变 | 事件总线、网络事件、日志、一次性事件 | _events = MutableSharedFlow<TcpEvent>() |
SharedFlow<T> | Flow | 对 MutableSharedFlow 的只读封装 | 只读 | 向 UI/外部暴露事件 | val events: SharedFlow<TcpEvent> = _events.asSharedFlow() |
asStateFlow() | 方法 | 将 MutableStateFlow 包装成只读 StateFlow | N/A | 封装内部状态,保证只读 | _uiState.asStateFlow() |
asSharedFlow() | 方法 | 将 MutableSharedFlow 包装成只读 SharedFlow | N/A | 封装事件流,保证只读 | _events.asSharedFlow() |
collectAsState(initial = ...) | Compose 扩展 | 将 Flow/StateFlow 收集并转成 Compose State,UI 可直接观察 | N/A | Compose 页面直接订阅状态流 | val uiState by viewModel.uiState.collectAsState() |
collectAsStateWithLifecycle(initial = ...) | Compose 扩展 | 和collectAsState类似,但会自动结合 Lifecycle,暂停/恢复收集 | N/A | 避免页面后台也收集,节省资源 | val uiState by viewModel.uiState.collectAsStateWithLifecycle() |
asFlow() | 方法 | 将集合、数组、Channel 转换为 Flow | N/A | 快速把已有数据转为 Flow | listOf(1,2,3).asFlow() |
remember { } | Compose | 保存 UI 内部状态,重组时不丢失 | N/A | 文本框内容、开关状态 | val count = remember { mutableStateOf(0) } |
rememberSaveable { } | Compose | 可序列化状态保存,重组或配置变化后恢复 | N/A | 表单输入、滚动位置 | val scroll = rememberSaveable { mutableStateOf(0) } |
rememberCoroutineScope() | Compose | 提供与 Composable 生命周期绑定的 CoroutineScope | N/A | 在 Composable 内启动协程 | val scope = rememberCoroutineScope() |
1. MutableStateFlow / StateFlow
作用: 保存状态,UI 可响应式绑定
// ViewModel private val _count = MutableStateFlow(0) val count: StateFlow<Int> = _count.asStateFlow() fun increment() { _count.value += 1 } // Compose 页面 @Composable fun Counter(viewModel: MyViewModel) { val count by viewModel.count.collectAsState() Column { Text("Count: $count") Button(onClick = { viewModel.increment() }) { Text("Increment") } } }2. MutableSharedFlow / SharedFlow
作用: 事件流,多收集者都能收到
// ViewModel private val _events = MutableSharedFlow<String>() val events: SharedFlow<String> = _events.asSharedFlow() fun triggerEvent(msg: String) { viewModelScope.launch { _events.emit(msg) } } // Compose 页面 @Composable fun EventLogger(viewModel: MyViewModel) { val scope = rememberCoroutineScope() LaunchedEffect(Unit) { viewModel.events.collect { msg -> println("Received event: $msg") } } Button(onClick = { scope.launch { viewModel.triggerEvent("Hello") } }) { Text("Send Event") } }3. asStateFlow / asSharedFlow
作用: 封装可变流,外部只读
private val _state = MutableStateFlow("Idle") val state: StateFlow<String> = _state.asStateFlow() private val _events = MutableSharedFlow<Int>() val events: SharedFlow<Int> = _events.asSharedFlow()4. collectAsState / collectAsStateWithLifecycle
作用: Flow → Compose State,UI 自动刷新
@Composable fun StatusScreen(viewModel: MyViewModel) { val status by viewModel.state.collectAsState(initial = "Idle") Text("Status: $status") } @Composable fun StatusScreenSafe(viewModel: MyViewModel) { val status by viewModel.state.collectAsStateWithLifecycle(initial = "Idle") Text("Status: $status") }5. asFlow()
作用: 集合 / 数组 / Channel → Flow
val numbers = listOf(1,2,3) val numberFlow = numbers.asFlow() @Composable fun NumberList() { LaunchedEffect(Unit) { numberFlow.collect { println(it) } // 输出 1 2 3 } }6. remember
作用: 保存 Composable 内部状态,重组不丢失
@Composable fun RememberExample() { val count = remember { mutableStateOf(0) } Column { Text("Count: ${count.value}") Button(onClick = { count.value += 1 }) { Text("Increment") } } }7. rememberSaveable
作用: 可跨配置变化(旋转屏幕)保存状态
@Composable fun RememberSaveableExample() { val text = rememberSaveable { mutableStateOf("") } TextField( value = text.value, onValueChange = { text.value = it }, label = { Text("Enter text") } ) }8. rememberCoroutineScope()
作用: 提供 Compose 生命周期绑定的 CoroutineScope
@Composable fun CoroutineExample(viewModel: MyViewModel) { val scope = rememberCoroutineScope() Button(onClick = { scope.launch { viewModel.fetchData() // 启动协程调用网络或数据库 } }) { Text("Fetch") } }总结
- StateFlow系列: 状态驱动 UI,更新自动刷新
- SharedFlow系列: 事件驱动,多收集者可收到事件
- asStateFlow / asSharedFlow: 封装只读接口
- collectAsState / collectAsStateWithLifecycle: Flow → Compose State,UI 自动更新
- remember / rememberSaveable: UI 内部状态保存,后者可跨配置变化
- rememberCoroutineScope: Compose 内安全协程作用域
