基于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
相关产品推荐
相关产品推荐

