Kotlin + Compose Flow State 手册

张开发
2026/4/10 14:28:51 15 分钟阅读

分享文章

Kotlin + Compose Flow  State 手册
概念作用示例MutableStateFlow / StateFlow状态流UI 绑定上面的 Counter 示例MutableSharedFlow / SharedFlow事件流多收集者上面的 EventLogger 示例asStateFlow / asSharedFlow封装可变流上面封装状态/事件流示例collectAsState / collectAsStateWithLifecycleFlow → Compose StateStatusScreen 示例asFlow集合/数组 → FlowNumberList 示例rememberCompose 内临时状态RememberExamplerememberSaveable跨配置状态保存RememberSaveableExamplerememberCoroutineScopeCompose 内协程CoroutineExample名称类型定义 / 作用是否可变用途 / 场景示例MutableStateFlowTFlow可变状态流保存单个状态值可变ViewModel 内部状态状态驱动 UI_uiState MutableStateFlow(0)StateFlowTFlow对 MutableStateFlow 的只读封装只读向 UI 暴露状态val uiState: StateFlowInt _uiState.asStateFlow()MutableSharedFlowTFlow可变事件流发射事件可被多个收集者收集可设置 replay可变事件总线、网络事件、日志、一次性事件_events MutableSharedFlowTcpEvent()SharedFlowTFlow对 MutableSharedFlow 的只读封装只读向 UI/外部暴露事件val events: SharedFlowTcpEvent _events.asSharedFlow()asStateFlow()方法将 MutableStateFlow 包装成只读 StateFlowN/A封装内部状态保证只读_uiState.asStateFlow()asSharedFlow()方法将 MutableSharedFlow 包装成只读 SharedFlowN/A封装事件流保证只读_events.asSharedFlow()collectAsState(initial ...)Compose 扩展将 Flow/StateFlow 收集并转成 Compose StateUI 可直接观察N/ACompose 页面直接订阅状态流val uiState by viewModel.uiState.collectAsState()collectAsStateWithLifecycle(initial ...)Compose 扩展和collectAsState类似但会自动结合 Lifecycle暂停/恢复收集N/A避免页面后台也收集节省资源val uiState by viewModel.uiState.collectAsStateWithLifecycle()asFlow()方法将集合、数组、Channel 转换为 FlowN/A快速把已有数据转为 FlowlistOf(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 生命周期绑定的 CoroutineScopeN/A在 Composable 内启动协程val scope rememberCoroutineScope()1. MutableStateFlow / StateFlow作用: 保存状态UI 可响应式绑定// ViewModel private val _count MutableStateFlow(0) val count: StateFlowInt _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 MutableSharedFlowString() val events: SharedFlowString _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: StateFlowString _state.asStateFlow() private val _events MutableSharedFlowInt() val events: SharedFlowInt _events.asSharedFlow()4. collectAsState / collectAsStateWithLifecycle作用: Flow → Compose StateUI 自动刷新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 → Flowval 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 生命周期绑定的 CoroutineScopeComposable fun CoroutineExample(viewModel: MyViewModel) { val scope rememberCoroutineScope() Button(onClick { scope.launch { viewModel.fetchData() // 启动协程调用网络或数据库 } }) { Text(Fetch) } }总结StateFlow系列: 状态驱动 UI更新自动刷新SharedFlow系列: 事件驱动多收集者可收到事件asStateFlow / asSharedFlow: 封装只读接口collectAsState / collectAsStateWithLifecycle: Flow → Compose StateUI 自动更新remember / rememberSaveable: UI 内部状态保存后者可跨配置变化rememberCoroutineScope: Compose 内安全协程作用域

更多文章