如何解决击中:注入应用程序范围内的存储库单例
我对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
在onSuccess
和onComplete
时调用,这意味着它调用了2次,第二次it.value
为空且_user
分配给{ {1}}。不是null
Hilt
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。