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

android kotlin Flow:distinctUntilChangedBy + stateIn 的坑

场景classLink(valkey:String){enumclassPhase{OFF,ON,RETRY}varphase:PhasePhase.OFF}varactive:Link?nullvalrevisionMutableStateFlow(0L)// 连接层 state 变了就 revisionfunonPhaseChanged(){revision.valueSystem.currentTimeMillis()}funonLinkLost(){active?.phaseLink.Phase.RETRY// 不换 Link 实例只改内部 phaseonPhaseChanged()}onLinkLost()只改active!!.phase RETRY不换新Link实例。问题写法distinct 后面接 stateInvallinkFlow:StateFlowLink?revision.map{active}.distinctUntilChangedBy{${it?.key}-${it?.phase}}.stateIn(scope,SharingStarted.WhileSubscribed(),null)phase从 ON 变 RETRY 时步骤发生什么revisionemit触发整条链distinctUntilChangedBykey 从k-ON变为k-RETRY放行stateIn写.value新值仍是同一个active引用 →old new→不通知 collectdistinct 按逻辑 key去重StateFlow按引用去重——多挡一层。linkFlow.collect{link-showOnline(link?.phaseLink.Phase.ON)}collect不重跑时showOnline不会更新link?.phase虽是 getterlambda 根本没执行。.value与缓存是同一规则valsameReflinkFlow.value// 引用在// phase 已 RETRY但 StateFlow 不会为此再推一次替代shareIn(replay 1)vallinkFlow:SharedFlowLink?revision.map{active}.distinctUntilChangedBy{${it?.key}-${it?.phase}}.shareIn(scope,SharingStarted.WhileSubscribed(),replay1)distinct放行后每次向SharedFlowemit 一次不因引用相同而跳过活跃collect会再跑。stateInshareIn(replay 1)同引用、仅phase变常不通知通知晚订阅首包.valuereplay 最后一次 emit同步读.valuereplayCache.lastOrNull()或读active?.phasereplay 0时晚订阅要等下一次revision进界面可能一直没有首包。实践注意、边界与自检必须StateFlow.value且实例可变stateIn前改成不可变快照如data class Snap(val key: String?, val phase: Phase)不要直接缓存Link?。求简单、同引用phase也要推distinctUntilChangedByshareIn(replay 1)。同步读当前phase直接读active?.phase别假设热流一定会再 emit。只改active却不revisiondistinct 上游无 tick换 shareIn 也没用。订阅方if (last link) return自行挡刷新与算子无关。自检distinct 日志/key 已变而 UI 不动 → 查stateIn引用判等晚订阅无首包 → 查replay要同步态 → 读变量或快照别只盯流。
http://www.zskr.cn/news/1387954.html

相关文章:

  • 一线观察发现:宝宝湿疹辅助改善的几个细节
  • 初次在Taotoken模型广场选型并成功调用新上线模型的步骤
  • 零基础做GEO 关键词覆盖?这份保姆级教程让你秒懂
  • PowerSetting极速下载优化方案全解析
  • 2025-2026年天津国际学校推荐:五大高性价比选择评测课程衔接案例市场份额 - 品牌推荐
  • 苏宁开放平台商品详情接口实战:多维度数据获取与结构化处理(附核心代码 + 避坑指南)
  • HAMi 源码阅读笔记 09:/bind 路由入口如何接收 kube-scheduler 的绑定请求
  • 对比测试:Claude Sonnet 4.6 vs GPT-5.5 vs DeepSeek V4
  • 微信小游戏19MB主包体积控制实战指南
  • Python TDD实战入门:从red-green-refactor到高覆盖率测试套件
  • 线程任务执行报错后,线程会不会挂掉,Java线程池
  • Unity微信小游戏实战:突破首包限制与WXSS兼容性难题
  • CAS:基于Go的AI终端工作台,重构人机协同工作流
  • AI编程协作:从语法记忆到意图表达的开发模式变革
  • 大模型安全全景解析——从DeepSeek看AI伦理与未来挑战
  • ROS1 Action通信从入门到放弃?不,是到精通!详解actionlib库与自定义消息实战
  • AI Agent记忆系统构建指南:从向量数据库到智能检索的完整实现
  • D2DX:如何让20年前的《暗黑破坏神2》在现代4K显示器上完美运行?
  • Codex CLI:终端里的代码生成瑞士军刀
  • 第4篇:数据博弈——税务大数据如何“看见”你的企业
  • 如何通过BIOS设置榨干硬件性能
  • Python海象运算符:=详解:赋值表达式原理与工程实践
  • 基于MCP协议为Claude构建无密钥实时数据访问架构
  • 构建AI技能CLI工具:mfkvault-cli的设计与实现
  • 金融企业如何搭建处理复杂合规流程的AI Agent?基于TARS大模型与实在Agent的生产力实践
  • Spring Boot 里怎么统计接口参数和耗时并打印日志
  • VR射击游戏开发:从坐标系同步到工业级框架实战
  • taotoken为内容创作团队提供的高效ai写作工作流
  • 问鼎优青·逐鹿杰青:国家人才项目答辩学术级ppt演示案例模板
  • Qt自定义控件-抽屉盒子