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

单向数据流 (UDF)

单向数据流原则 (Unidirectional Data Flow)
在 Android 开发中,单向数据流是构建可预测、可维护 UI 的核心原则。

在 Jetpack Compose 中的实现

// ✅ 正确:单向数据流dataclassPlaylistUiState(valplaylists:List<Playlist>=emptyList(),valisLoading:Boolean=false,valerror:String?=null)classPlaylistViewModel:ViewModel(){privateval_uiState=MutableStateFlow(PlaylistUiState())valuiState:StateFlow<PlaylistUiState>=_uiState.asStateFlow()// 唯一的状态变更入口funonEvent(event:PlaylistEvent){when(event){isPlaylistEvent.LoadPlaylists->loadPlaylists()isPlaylistEvent.DeletePlaylist->deletePlaylist(event.id)isPlaylistEvent.SelectPlaylist->selectPlaylist(event.id)}}privatefunloadPlaylists(){viewModelScope.launch{_uiState.update{it.copy(isLoading=true)}try{valplaylists=playlistRepository.getAll()_uiState.update{it.copy(isLoading=false,playlists=playlists)}}catch(e:Exception){_uiState.update{it.copy(isLoading=false,error=e.message)}}}}}// UI 层:纯渲染,不含业务逻辑@ComposablefunPlaylistScreen(viewModel:PlaylistViewModel=viewModel()){valuiStatebyviewModel.uiState.collectAsState()PlaylistContent(state=uiState,onLoadClick={viewModel.onEvent(PlaylistEvent.LoadPlaylists)},onDeleteClick={id->viewModel.onEvent(PlaylistEvent.DeletePlaylist(id))})}

❌ 常见的反模式

// ❌ 错误:直接在 UI 层修改状态@ComposablefunBadExample(){varcountbyremember{mutableIntStateOf(0)}Button(onClick={count++}){// 直接修改状态Text("点击:$count")}}// ❌ 错误:ViewModel 直接操作 UIclassBadViewModel:ViewModel(){funupdateUI(){// ❌ 绝对不要持有 Compose 的引用// activity?.runOnUiThread { ... }}}

与双向绑定的对比

特性双向绑定 (传统)单向数据流 (Compose)
数据来源View 和 ViewModel 都可以修改只有 ViewModel
调试难度难(状态可能在多处被修改)易(变更追踪唯一)
测试性需要 mock UI 组件可独立测试 ViewModel
复杂度简单场景简单需要定义 Action/State

简单来说:UI 只负责"展示",不负责"判断"和"修改"。所有决策逻辑都集中在 ViewModel 层。

http://www.jsqmd.com/news/692667/

相关文章:

  • 英雄联盟回放分析终极指南:ROFL播放器完全使用教程
  • 智慧工业安全监控 钢渣厂安全监测 机械化料场安全监测 工业场景下目标检测模型 工业数字化与智能化扬尘识别 卸载识别第10318期
  • 3分钟快速上手:WaveTools鸣潮工具箱终极画质优化指南
  • 别只当平板用!Surface Go变身学术研究神器的完整配置清单(含PDF批注、文献管理、论文写作)
  • 分析2026年3M标签定制加工公司哪家好,这些要点要知道 - 工业品牌热点
  • 2026年|从“AI学术刺客”变身“查重克星”:降重降AI工具拯救你的论文 - 降AI实验室
  • 2026年中式整装机构精选名单,靠谱的中式整装企业/推荐的中式整装品牌公司/资质齐全的中式整装企业 - 品牌策略师
  • 别再死记硬背了!用Python+NumPy玩转Voigt符号,轻松搞定张量计算
  • 机器学习数据泄露防范与工程实践指南
  • Windows 11 + RTX 40系显卡?PyTorch CUDA环境搭建避坑指南(附最新驱动和版本匹配表)
  • KMS_VL_ALL_AIO:Windows和Office智能激活终极指南
  • 从针孔到透镜:计算机视觉成像模型的演进与实战解析
  • 2026年温州地区口碑佳的中通物流,费用及服务特色全梳理 - myqiye
  • 聊聊朝阳1号的质量有保障吗,冬季专用轮胎价位如何及性价比咋样 - 工业品网
  • 探究中通快递详细介绍与广告策略,在各区域口碑排名怎样 - 工业推荐榜
  • Qt QStyle实战:从原理到自定义控件绘制
  • 为什么说私有化会议系统的价值不止是不开公网会议
  • 讲讲上海、江苏、浙江地区3m厂家直销靠谱吗,哪家性价比高 - 工业设备
  • 终极ModTheSpire完全指南:安全无风险的杀戮尖塔模组加载解决方案
  • 什么是人工智能(AI)?
  • 2026年厦门求推荐团队专业的装修设计公司 - 工业推荐榜
  • 2026年厦门装修设计性价比排名,哪家老牌企业材料优质售后好 - 工业品牌热点
  • 大模型的发展现状、风险挑战及对策建议
  • 别再乱用@RequestParam了!SpringBoot接收form-data和x-www-form-urlencoded的完整配置与实战避坑
  • m4s-converter:B站缓存视频无损转换的终极解决方案
  • 2026年3M官方授权经销商如何选择,上海岸雄为您支招 - mypinpai
  • 解读云南艺考生高考文化课集训,滇云教育靠谱品牌 - mypinpai
  • 2026年西宁绿色环保金属保温一体板价格多少钱 - myqiye
  • 实测对比:img2table vs Camelot vs Tabula,谁才是Python里提取PDF表格的‘性价比之王’?
  • 嵌入式C如何扛住1MB Flash+256KB RAM下的LLM推理?揭秘ARM Cortex-M7上Qwen2-0.5B量化部署的7个硬核优化步骤