MVVM架构下优化含枚举的密封类Resource实现方案咨询
优化后的MVVM Resource实现方案
优化思路
直接利用Kotlin密封接口的特性,用不同子类来表示请求的不同状态(成功/错误/加载),彻底移除冗余的枚举类型。这样状态与数据载体直接绑定,类型更安全,代码逻辑也更简洁。
优化后的Resource密封接口实现
sealed interface Resource<out T> { // 成功状态:携带核心数据,其余参数设默认值简化调用 data class Success<out T>( val data: T, val message: String = "", val code: Int = 200, val state: Boolean = true ) : Resource<T> // 错误状态:必填错误消息和状态码,可选携带部分返回数据 data class Error<out T>( val data: T? = null, val message: String, val code: Int, val state: Boolean = false ) : Resource<T> // 加载状态:仅保留状态标识,无需额外数据字段 data class Loading<out T>(val state: Boolean = true) : Resource<T> }
View中的状态访问与处理
通过Kotlin的when表达式直接判断密封子类类型,编译器会自动检查是否穷尽所有状态分支,避免遗漏:
// 示例:从ViewModel收集资源流并处理状态 viewModel.resourceData.collect { resource -> when (resource) { is Resource.Success -> { // 处理成功逻辑:展示数据、提示消息 updateUI(resource.data) showTip(resource.message) } is Resource.Error -> { // 处理错误逻辑:显示错误提示,可选处理部分返回数据 showError(resource.message) resource.data?.let { showPartialContent(it) } } is Resource.Loading -> { // 处理加载逻辑:显示/隐藏加载动画 setLoadingVisible(resource.state) } } }
对比旧实现的优势
- 类型安全:无需依赖枚举值判断状态,直接通过子类类型区分,避免状态与数据不匹配的潜在问题
- 代码简洁:移除了冗余的枚举定义和状态字段,状态与数据天然绑定
- 易维护:新增状态只需添加密封子类,
when表达式会自动提示补充分支,减少遗漏
内容的提问来源于stack exchange,提问作者Ishika Singh
相关产品推荐
相关产品推荐

