MVVM 架构

MVVM 架构

温馨提示:本文最后更新于2025-12-17 23:26:25,某些文章具有时效性,若有错误或已失效,请在下方留言

MVVM(Model-View-ViewModel) 架构中 ViewViewModel 以及 Model 之间的交互逻辑,如下图所示

MVVM 架构交互逻辑

基本介绍

MVVM 架构的分层,如下图所示

MVVM 各层
XML MVVM 架构,ViewModel 层使用 LiveData
图片[3]-MVVM 架构-Stewed Noodles 资源
Jetpack Compose MVVM 架构,ViewModel 层使用 MutableStateOf

Model(模型)

这一层负责对数据源进行抽象。ModelViewModel 协作以获取和保存数据。

Repository

Repository(仓库) 是一种架构模式,用于统一管理数据来源,并向上层(ViewModel / UseCase)提供数据访问接口。

Repository 负责决定数据从哪里来(网络 / 数据库 / 缓存),对外只暴露统一的数据接口。

View(视图)

这一层的作用是将用户的操作通知给 ViewModelView 会观察 ViewModel,并且不包含应用程序逻辑。

ViewModel(视图模型)

用于 存储和管理与 UI 相关的数据 ,将 UI 相关逻辑UI 控制器(Composable / Activity / Fragment) 分离开来。它会向 View 暴漏与其相关的数据流。此外,它充当 ModelView 之间的连接桥梁。

ViewModel vs AndroidViewModel

类别是否持有 Application适用场景
ViewModel❌ 不持有 Application不需要访问 Context
管理 UI 状态
处理业务逻辑
Repository 已提供数据,无需 Context
AndroidViewModel✅ 持有 Application访问 Room 数据库
读取 SharedPreferences
加载资源文件(如字符串、图片 ID)
启动后台任务需要 Context
使用系统服务(如 ConnectivityManager

ViewModelFactory

ViewModelFactory 用于创建带参数的 ViewModelViewModel 不能直接通过构造函数传参

// ViewModel
class UserViewModel(
    private val repository: UserRepository
) : ViewModel() {

    fun loadUser() {
        viewModelScope.launch {
            repository.getUser()
        }
    }
}
// ViewModelFactory
class UserViewModelFactory(
    private val repository: UserRepository
) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        if (modelClass.isAssignableFrom(UserViewModel::class.java)) {
            @Suppress("UNCHECKED_CAST")
            return UserViewModel(repository) as T
        }
        throw IllegalArgumentException("Unknown ViewModel class")
    }
}

具体的使用

val factory = UserViewModelFactory(repository)
val viewModel = ViewModelProvider(this, factory)
    .get(UserViewModel::class.java)
© 版权声明
THE END
喜欢就支持一下吧
点赞0赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容