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

MVVM开源项目

https://github.com/wangjianxiandev/WanAndroidMvvm

https://gitee.com/jenly1314/AppTemplate

 ResState 密封类是一个非常典型的网络请求状态封装,适用于大多数 MVVM 架构中的数据请求场景。它清晰地划分了三种核心状态:加载中(Loading)、成功(Success)、错误(Error),并且支持携带数据和错误信息。
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import java.io.IOException
import retrofit2.HttpException// 1. 数据模型:用户信息
data class User(val id: String,val name: String,val email: String,val avatarUrl: String
)// 2. 仓库层:封装数据来源(网络/本地)
class UserRepository {// 模拟网络请求:获取用户信息suspend fun getUserInfo(userId: String): User {// 实际项目中替换为Retrofit调用delay(1500) // 模拟网络延迟// 模拟不同场景return when (userId) {"valid_id" -> User(id = "valid_id",name = "张三",email = "zhangsan@example.com",avatarUrl = "https://example.com/avatar/zhangsan")"empty_data" -> throw IllegalArgumentException("用户数据为空") // 业务异常"network_error" -> throw IOException("网络连接超时") // 网络异常else -> throw HttpException(retrofit2.Response.error<Unit>(404, okhttp3.ResponseBody.create(null, ""))) // 接口异常}}
}// 3. ViewModel:处理业务逻辑与状态管理
class UserViewModel(private val repository: UserRepository = UserRepository() // 实际项目中通过依赖注入
) : ViewModel() {// 私有可变状态:仅内部修改private val _userState = MutableStateFlow<ResState<User>>(ResState.Loading)// 公开不可变状态:供View观察val userState: StateFlow<ResState<User>> = _userState.asStateFlow()// 加载用户信息(供View调用)fun fetchUserInfo(userId: String) {// 立即发送加载状态_userState.value = ResState.Loading// 在ViewModel作用域中启动协程viewModelScope.launch {try {// 调用仓库层获取数据val user = repository.getUserInfo(userId)// 发送成功状态(携带数据)_userState.value = ResState.Success(user)} catch (e: Exception) {// 根据异常类型设置错误状态val errorState = when (e) {is HttpException -> ResState.Error(errorCode = e.code(),errorMsg = "接口错误:${e.message() ?: "未知错误"}")is IOException -> ResState.Error(errorCode = -100,errorMsg = "网络异常:请检查网络连接")else -> ResState.Error(errorCode = -1,errorMsg = e.message ?: "未知错误")}_userState.value = errorState}}}// 重置状态(可选:用于刷新或返回初始状态)fun resetState() {_userState.value = ResState.Loading}
}// 4. 状态密封类(复用你定义的ResState)
sealed class ResState<out T> {data class Success<out T>(val data: T? = null) : ResState<T>()data class Error(var errorCode: Int = -1, var errorMsg: String = "") : ResState<Nothing>()object Loading : ResState<Nothing>()
}

http://www.xdnf.cn/news/18173.html

相关文章:

  • Netty处理粘包与拆包
  • vue使用vue-cropper实现图片裁剪之单图裁剪
  • 关于mybatis表关联查询和mybatis-Plus单表查询传入时间查询数据(走索引)
  • Linux Namespace 隔离的“暗面”——故障排查、认知误区与演进蓝图
  • CVPR 2025 | 具身智能 | HOLODECK:一句话召唤3D世界,智能体的“元宇宙练功房”来了
  • 【HTML】3D动态凯旋门
  • 通过C#上位机串口写入和读取浮点数到stm32的片内flash实战4(通过串口下发AD9833设置值并在上位机显示波形曲线)
  • “你不干有的是AI干”,提示词中的“情感化提示”
  • 如何在 Ubuntu Linux 上安装 RPM 软件包
  • 【SQL优化案例】统计信息缺失
  • Vercel v0 iOS版重磅发布:AI驱动的移动开发新篇章
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘paramiko’问题
  • C++入门自学Day14-- Stack和Queue的自实现(适配器)
  • Java高级面试实战:Spring Boot微服务与Redis缓存整合案例解析
  • “R语言+遥感”的水环境综合评价方法实践技术应用
  • Centos7物理安装 Redis8.2.0
  • 【GNSS定位原理及算法杂记6】​​​​​​PPP(精密单点定位)原理,RTK/PPK/PPP区别讨论
  • 【部署相关】DockerKuberbetes常用命令大全(速查+解释)
  • 孩子王披露半年报:多数据持续增长,全年预期增强
  • git仓库和分支的关系
  • Linux GPIO子系统中开漏模式软件仿真机制的深度分析
  • 【深度学习计算性能】06:多GPU的简洁实现
  • 树状数组/差分数组/线段树/莫队算法介绍
  • 政务窗口服务满意度调查:服务型政府建设赋能方案(北京市场调研)
  • 2025年12大AI测试自动化工具
  • 电子电气架构 --- 软件项目风险管理
  • 「内力探查术」:用 Instruments 勘破 SwiftUI 卡顿迷局
  • Android Coil 3拦截器Interceptor计算单次请求耗时,Kotlin
  • 软件测试-Selenium学习笔记
  • Node.js 在 Windows Server 上的离线部署方案