android - Hilt:注入应用程序范围的存储库单例
问题描述
我对 Dagger 比较陌生,我刚开始使用 Hilt。我想要的是注入一个应用程序范围的存储库(意味着它需要在任何地方都是相同的对象)到ViewModel
. 存储库将用于检索用户、身份验证令牌和类似的东西。这是我能得到的最接近的:
@Module
@InstallIn(ApplicationComponent::class)
abstract class ApplicationModule {
@Singleton
@Binds
abstract fun bindUserService(
userRepository: UserRepository
): UserService
}
@Singleton
class UserRepository @Inject constructor(
) : UserService {
private var _user: User? = null
override fun getUser(): Observable<User> {
return if (_user == null) {
fetchUser()
} else {
Observable.just(_user)
}
}
private fun fetchUser(): Observable<User> {
return Observable.just(User("foo", Random.nextDouble(100.00)))
.delay(2, TimeUnit.SECONDS)
.doOnEach { _user = it.value }
}
}
class ProfileViewModel @ViewModelInject constructor(
private val userService: UserService,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
val user: MutableLiveData<User> by lazy {
MutableLiveData<User>()
}
fun init() {
userService.getUser().observeOn(AndroidSchedulers.mainThread()).subscribe { user.apply { value = it } }
}
}
这样一切正常,使用调试我可以确认每次ViewModel
使用相同的实例UserRepository
注入。问题是_user
第二null
次(例如视图被销毁并重新创建)getUser()
被调用。我不知道我是在 kotlin 方面犯了一些愚蠢的错误,还是在 Hilt 方面犯了一个愚蠢的错误。
知道发生了什么吗?
解决方案
在您的情况下doOnEach
调用 when onSuccess
,onComplete
这意味着它调用了 2 次,第二次it.value
为 null 并再次_user
分配给null
。这不是错误Hilt
private fun fetchUser(): Observable<User> {
return Observable.just(User("foo", Random.nextDouble(100.00)))
.delay(2, TimeUnit.SECONDS)
.doOnEach { _user = it.value }
}
推荐阅读
- makefile - 生成的 Makefile.in 是用什么语言编写的?
- java - 为什么正则表达式最后少匹配一个字符?
- android - Android sdk 不包含在 android studio 中
- amazon-web-services - AWS EMR 集群可以解析 JFrog Artifactory jar 包吗?
- javascript - 为什么我在尝试过滤电影 release_date 时变得不确定?
- c++ - 这种排序算法是否已经存在?
- asp.net-core - 恢复 .net core 2.0 应用升级到 2.1 时出错
- docker - 通过共享网络连接 docker-compose 文件
- javascript - 重新加载通过 ng-repeat 创建的更改内容而不刷新整个页面
- php - 使用 php 和 pdo 执行 .sql 文件