You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
        }
    }
}

对比旧实现的优势

  1. 类型安全:无需依赖枚举值判断状态,直接通过子类类型区分,避免状态与数据不匹配的潜在问题
  2. 代码简洁:移除了冗余的枚举定义和状态字段,状态与数据天然绑定
  3. 易维护:新增状态只需添加密封子类,when表达式会自动提示补充分支,减少遗漏

内容的提问来源于stack exchange,提问作者Ishika Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 23:24:58