当前位置: 首页 > news >正文

Kotlin + Compose Flow State 手册

概念作用示例
MutableStateFlow / StateFlow状态流,UI 绑定上面的 Counter 示例
MutableSharedFlow / SharedFlow事件流,多收集者上面的 EventLogger 示例
asStateFlow / asSharedFlow封装可变流上面封装状态/事件流示例
collectAsState / collectAsStateWithLifecycleFlow → Compose StateStatusScreen 示例
asFlow集合/数组 → FlowNumberList 示例
rememberCompose 内临时状态RememberExample
rememberSaveable跨配置状态保存RememberSaveableExample
rememberCoroutineScopeCompose 内协程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 包装成只读 StateFlowN/A封装内部状态,保证只读_uiState.asStateFlow()
asSharedFlow()方法将 MutableSharedFlow 包装成只读 SharedFlowN/A封装事件流,保证只读_events.asSharedFlow()
collectAsState(initial = ...)Compose 扩展将 Flow/StateFlow 收集并转成 Compose State,UI 可直接观察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: 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 内安全协程作用域
http://www.cnnetsun.cn/news/1804068.html

相关文章:

  • AI辅助技术:企业数字化转型的关键驱动力与实践指南
  • 动漫爱好者福音:Flux2 Klein写实转换,让你的角色活起来
  • 从仿真到实物:基于Multisim 12的直流稳压电源设计与实现
  • 低查重AI教材生成工具,快速编写专业教材,提升教学资料产出效率!
  • AI教材生成神器登场!快速编写教材,轻松搞定低查重难题
  • 华中科技大学毕业论文LaTeX模板:终极完整使用指南
  • LrcHelper:3步搞定网易云音乐双语歌词下载,索尼Walkman用户必看!
  • 【SITS全球化布局深度解码】:奇点智能技术大会透露的3大战略转折点与2024出海实战路径
  • iptables防火墙知识小结【20260410】005篇
  • 终极GPU监控指南:为什么nvitop比nvidia-smi更强大?
  • 从场景到命令:一文读懂SSH端口转发的三种核心模式
  • AudioSeal Pixel Studio保姆级教程:WAV/MP3/FLAC多格式水印嵌入全流程
  • 009、数据连接基石:文档加载器(Document Loaders)大全
  • P1134 阶乘问题【洛谷算法习题】
  • 电驱端盖锁付反力路径不稳致曲线异常?砺星如何控姿态
  • 论文图表自由!Paperxie AI 科研绘图:从零基础到顶刊级,一键搞定所有学术绘图需求
  • 跨境电商研发团队文件外发安全管控
  • 终极命令行工具:如何用BaiduPCS-Go高效管理百度网盘文件
  • 别再只盯着遗传算法了:一文搞懂进化算法家族(遗传/进化策略/进化编程/GEP)的区别与选择
  • GLM-. 全面支持与 Gemini CLI 集成:HagiCode 的多模型进化之路套
  • 推荐学哪个RPA工具?怎么入门、练手、考证?
  • 【AI原生开发范式革命指南】:20年架构师亲授从Spring Boot到LLM-Ops的5大跃迁路径
  • 硬件工程师常用网站
  • 顶级开发团队设计的Harness工程项目源码什么样
  • 如何突破Cursor Pro限制?3个技术方案让你免费享受AI编程助手
  • G-Helper终极指南:简单三步彻底优化你的华硕笔记本性能
  • VLA分布式协同中枢:Deepoc开发板激活采摘机器人集群智能
  • Bitfocus Companion:如何用开源软件将普通控制器变身专业控制台?
  • 跨境电商小帮手:OpenClaw+千问3.5-27B自动回复商品咨询
  • Win11系统虚拟化性能优化指南:VBS关闭与配置全解析