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

基于MVVM与Hilt架构,如何全局存储User对象?

基于MVVM+Hilt的全局User对象管理方案(无本地存储)

针对你的需求,最合理的方案是通过单例级别的UserRepository来管理全局User对象,结合Hilt的依赖注入能力,实现跨页面、跨ViewModel的全局访问,同时符合MVVM的设计原则。

具体实现步骤

1. 实现单例UserRepository

创建一个被Hilt标记为@Singleton的Repository类,专门负责持有和管理User对象。它会在应用进程启动时初始化,只要进程不被销毁,数据就会一直保留:

@Singleton
class UserRepository @Inject constructor() {
    // 持有当前用户对象
    private var currentUser: User? = null
    // 可选:用StateFlow实现响应式更新,方便页面监听用户数据变化
    private val userStateFlow = MutableStateFlow<User?>(null)

    // 设置用户,登录/注册成功后调用
    fun setCurrentUser(user: User) {
        currentUser = user
        userStateFlow.value = user
    }

    // 获取当前用户
    fun getCurrentUser(): User? = currentUser

    // 提供可监听的用户流,供ViewModel订阅
    fun getUserStateFlow(): StateFlow<User?> = userStateFlow.asStateFlow()
}

2. 在认证流程中更新User对象

在你的Authenticator类中注入UserRepository,登录/注册成功后,将返回的User对象存入Repository:

class Authenticator @Inject constructor(
    private val apiService: ApiService,
    private val userRepository: UserRepository
) {
    suspend fun login(email: String, password: String): User {
        // 调用登录接口获取用户数据
        val user = apiService.login(email, password)
        // 存入全局Repository
        userRepository.setCurrentUser(user)
        return user
    }

    suspend fun register(userInfo: UserInfo): User {
        val user = apiService.register(userInfo)
        userRepository.setCurrentUser(user)
        return user
    }
}

3. 在ViewModel中访问全局User对象

所有需要User数据的ViewModel,只需通过Hilt注入UserRepository,即可直接获取或监听用户数据:

比如个人资料页的ViewModel:

class ProfileViewModel @Inject constructor(
    private val userRepository: UserRepository
) : ViewModel() {
    // 直接获取当前用户
    val currentUser: User? get() = userRepository.getCurrentUser()

    // 或者订阅用户流,实现数据变化时自动更新UI
    val userFlow = userRepository.getUserStateFlow()
}

首页的ViewModel同理:

class HomeViewModel @Inject constructor(
    private val userRepository: UserRepository,
    private val blogService: BlogService
) : ViewModel() {
    fun fetchUserBlogs() = viewModelScope.launch {
        val userId = userRepository.getCurrentUser()?.id ?: throw IllegalStateException("用户未登录")
        val blogs = blogService.getUserBlogs(userId)
        // 处理博客数据
    }
}

方案优势

  • 符合你的需求:User对象存储在内存中,仅当应用完全重启(进程销毁)时才会丢失,无需本地存储;
  • 遵循MVVM原则:ViewModel只负责对应页面的业务逻辑,全局数据由专门的Repository管理,避免了ViewModel职责混乱;
  • 跨页面共享:通过Hilt的单例注入,所有ViewModel都能访问同一个User对象,解决了多Activity间无法共享ViewModel的问题;
  • 扩展性强:如果后续需要添加用户数据的监听、更新逻辑,只需在Repository中扩展,无需修改各个ViewModel。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:34:56