QueryViewState 状态机设计:reactive-mvvm-android 中 sealed class 管理加载、错误与结果的完整方案
QueryViewState 状态机设计reactive-mvvm-android 中 sealed class 管理加载、错误与结果的完整方案【免费下载链接】reactive-mvvm-androidMy way to MVVM using KotlinX Coroutines and Android>项目地址: https://gitcode.com/gh_mirrors/re/reactive-mvvm-androidreactive-mvvm-android 是一个基于 KotlinX Coroutines 与 Android DataBinding 构建的 MVVM 开源项目其核心设计是用sealed class 状态机 QueryViewState统一管理加载Loading、错误Error与结果Result三种 UI 状态实现 ViewModel 与视图的自动绑定。本文带你完整拆解这套状态机方案的设计思路与落地方式 为什么需要状态机管理 UI 状态在 Android 开发中一个页面通常会同时出现多种状态正在加载、加载成功、网络出错、结果为空……如果用一堆布尔变量isLoading、hasError、isEmpty来描述很快就会出现互相矛盾的组合例如正在加载和出错同时为真。reactive-mvvm-android 的做法是把所有状态收敛成一个不可变的类型——sealed class。sealed class 的子类集合在编译期就完全封闭Kotlin 的when表达式可以穷尽所有分支编译器会帮你兜底不会出现遗漏状态的 bug。QueryViewState 状态机全貌核心文件app/src/main/java/es/ffgiraldez/comicsearch/query/base/presentation/QueryViewState.kt整个状态机只有 4 个分支职责清晰状态类型含义Idleobject初始空闲尚未发起查询Loadingobject请求进行中显示进度条ResultTdata class携带查询结果列表泛型 T 支持不同数据类型Errordata class携带ComicError错误信息三个设计亮点值得学习泛型化设计QueryViewStateout T使用协变out声明同一个状态机既能装搜索结果Volume漫画卷对象也能装搜索建议String一套代码服务多个页面。单例与数据分离Idle和Loading是无状态的用object单例避免重复创建Result和Error携带数据用data class天然获得equals与copy能力。Companion 工厂方法通过QueryViewState.idle()、loading()、result(list)、error(err)四个工厂方法创建状态调用方无需关心具体子类名可读性更强。错误类型同样使用 sealed class 定义app/src/main/java/es/ffgiraldez/comicsearch/comics/domain/Entities.kt中的ComicError区分NetworkError与EmptyResultsError让没有结果和网络失败两种语义各得其所。状态流转Flow Either 自动产出 ViewState状态如何从 Repository 流向 UI答案是Flow 响应式管线。基类SuspendQueryStateViewModelapp/src/main/java/es/ffgiraldez/comicsearch/query/base/presentation/SuspendQueryStateViewModel.kt接收一个转换器函数(FlowString) - FlowQueryViewStateT将用户输入的查询词流转换为状态流并通过asLiveData暴露为LiveDataQueryViewStateT。以搜索场景为例app/src/main/java/es/ffgiraldez/comicsearch/query/search/presentation/SuspendSearchViewModel.kt状态流转逻辑非常精炼用户每次输入触发flatMapLatest自动取消上一次未完成的请求防抖式快速搜索的关键每次请求开始时通过onStart { emit(QueryViewState.loading()) }自动插入加载态仓库返回的数据类型是 Arrow 库的EitherComicError, ListT通过扩展函数toViewState()定义在 QueryViewState.kt 底部一键折叠为Error或Result状态流开始时发出idle()作为初始状态。建议搜索场景app/src/main/java/es/ffgiraldez/comicsearch/query/sugestion/presentation/SuspendSuggestionViewModel.kt在此之上再加了debounce(400)防抖和distinctUntilChanged()去重——这正是状态即数据思想的延伸状态流可以像普通 Flow 一样用操作符自由组合。DataBinding让 UI 自动响应状态变化状态机设计的收益在 UI 层集中体现。扩展属性文件app/src/main/java/es/ffgiraldez/comicsearch/query/base/ui/QueryViewStateExt.kt为每个状态提供了安全访问器state.error非错误态返回nullstate.results非结果态返回空列表state.loading布尔值判断。视图层通过 DataBinding 的BindingAdapter把QueryViewState直接绑到控件上见app/src/main/java/es/ffgiraldez/comicsearch/query/search/ui/SearchBindingAdapters.ktProgressBar.bindProgress根据loading属性控制进度条显隐FrameLayout.bindStateVisibility出错时显示错误容器TextView.bindErrorText把错误转换为人类可读文案RecyclerView.bindStateData用results属性直接提交列表数据。ViewModel 中when逻辑一行都没有——状态一变DataBinding 自动驱动所有控件刷新。Activity 代码中完全不出现判断状态再操作控件的样板代码这就是 sealed class 状态机 DataBinding 的组合威力 ✨可测试性状态机带来的红利因为状态是纯数据单元测试可以精确断言整个状态流转序列。app/src/test/java/es/ffgiraldez/comicsearch/query/search/presentation/SearchViewModelSpec.kt中使用 Kotest Turbine 的写法非常直观断言初始状态为Idle→ 输入查询词后变为Loading→ 最终等于由toViewState()生成的预期状态。搜索建议页面同样有对应的测试app/src/test/java/es/ffgiraldez/comicsearch/query/sugestion/presentation/SuggestionViewModelSpec.kt。状态机 属性测试Arbitrary 生成随机数据让这套逻辑的回归保障非常扎实。总结这套方案能带给你什么用 sealed class 收敛所有 UI 状态编译期穷尽检查杜绝非法状态组合泛型状态机 工厂方法一套设计复用搜索、建议等多个功能页面Flow 管线中插入状态onStart发 Loading、Either折叠发 Error/Result状态流转声明式、可组合扩展属性 BindingAdapter让 DataBinding 直接消费状态UI 零样板代码状态即数据单元测试可逐步断言完整流转序列。这套仅百行代码量级的设计就是 Android MVVM 架构中响应式状态管理的一个优雅范本值得在你的项目中借鉴复用 【免费下载链接】reactive-mvvm-androidMy way to MVVM using KotlinX Coroutines and Android>项目地址: https://gitcode.com/gh_mirrors/re/reactive-mvvm-android创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

数学建模实战:基于EM算法与BIC准则的法医DNA混合样本解析

数学建模实战:基于EM算法与BIC准则的法医DNA混合样本解析

1. 项目概述:从一道赛题看数学建模的实战价值刚拿到2025年深圳杯数学建模D题“法医物证多人身份鉴定问题”的题目时,我第一反应是:这题出得真“接地气”。它没有停留在抽象的理论层面,而是直接把一个法医物证鉴定实验室里真实存在…

2026/8/24 17:14:29 阅读更多 →
多行文本、AutoSize与Rich Text全兼容:RTLTMPro功能全景实战指南

多行文本、AutoSize与Rich Text全兼容:RTLTMPro功能全景实战指南

多行文本、AutoSize与Rich Text全兼容:RTLTMPro功能全景实战指南 【免费下载链接】RTLTMPro Right-To-Left Text Mesh Pro for Unity. This plugin adds support for Persian and Arabic languages to TextMeshPro. 项目地址: https://gitcode.com/gh_mirrors/rt/…

2026/8/24 17:14:29 阅读更多 →
江苏大学885程序设计备考:编程大题解题思维与实战技巧精讲

江苏大学885程序设计备考:编程大题解题思维与实战技巧精讲

1. 项目概述:一份来自“战场”的编程题攻坚笔记如果你正在备战江苏大学计算机相关专业的885程序设计科目,尤其是被那些分值高、灵活性强的编程大题所困扰,那么这份笔记可能就是为你准备的。它不是一本面面俱到的教科书,而更像是一…

2026/8/24 17:14:29 阅读更多 →

最新新闻

Windows安全中心全灰之后:一条命令快速恢复 Windows Defender

Windows安全中心全灰之后:一条命令快速恢复 Windows Defender

Windows安全中心全灰之后:一条命令快速恢复 Windows Defender 【免费下载链接】no-defender A slightly more fun way to disable windows defender firewall. (through the WSC api) 项目地址: https://gitcode.com/GitHub_Trending/no/no-defender 安全中…

2026/8/24 18:56:35 阅读更多 →
Simulink全桥逆变电路建模:6 IGBT拓扑与开关过程仿真分析

Simulink全桥逆变电路建模:6 IGBT拓扑与开关过程仿真分析

1. 项目缘起:为什么从全桥电路开始? 如果你正在接触电力电子,尤其是开关电源、逆变器或者电机驱动,那么“全桥电路”这个结构对你来说一定不陌生。它几乎是中高功率等级应用中的“标配”拓扑,从我们日常用的电磁炉、电…

2026/8/24 18:56:35 阅读更多 →
X-Mouse Controls 完整指南:用 3 个参数实现焦点跟随鼠标,去掉多窗口切换的多余点击

X-Mouse Controls 完整指南:用 3 个参数实现焦点跟随鼠标,去掉多窗口切换的多余点击

X-Mouse Controls 完整指南:用 3 个参数实现焦点跟随鼠标,去掉多窗口切换的多余点击 【免费下载链接】xmouse-controls Microsoft Windows utility to manage the active window tracking/raising settings. This is known as x-mouse behavior or focus…

2026/8/24 18:56:35 阅读更多 →
C语言数组与指针实战:从基础到冒泡排序与内存管理

C语言数组与指针实战:从基础到冒泡排序与内存管理

大家好,我是长期分享C语言实战经验的博主。在初学C语言时,数组、指针、排序这些概念常常让开发者感到混乱,尤其是面对二维数组、字符串数组和排序算法时,网上资料往往零散不成体系。本文将系统性地梳理C语言数组的核心知识&#x…

2026/8/24 18:56:35 阅读更多 →
互联网医疗Java技术栈实战与面试指南

互联网医疗Java技术栈实战与面试指南

1. 互联网医疗行业的技术挑战与人才需求互联网医疗行业近年来呈现爆发式增长,这个领域的技术架构既要满足医疗行业特有的严谨性和合规性要求,又要具备互联网产品的高并发、高可用特性。作为从业多年的技术面试官,我发现大厂在招聘Java工程师时…

2026/8/24 18:56:35 阅读更多 →
C语言实现控制台3D玫瑰:数学建模与字符图形渲染实战

C语言实现控制台3D玫瑰:数学建模与字符图形渲染实战

1. 项目缘起:当C语言遇上浪漫 最近在技术社区里,看到不少朋友在讨论用各种编程语言画图,Python的turtle库、JavaScript的Canvas自然是常客。但作为一个老C程序员,我心里总有点不服气:难道C语言就只能处理枯燥的数据和算…

2026/8/24 18:55:35 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →