gpt4 book ai didi

android - 刀柄 : injecting application-wide repository singleton

转载 作者:行者123 更新时间:2023-12-04 13:33:43 35 4
gpt4 key购买 nike

我对 Dagger 比较陌生,我刚开始使用 Hilt。我想要的是注入(inject)一个应用程序范围的存储库(意味着它需要在任何地方都是相同的对象)到 ViewModel .存储库将用于检索用户、身份验证 token 和类似的东西。这是我能得到的最接近的:

@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 的相同实例被注入(inject)。问题是 _usernull第二次(例如 View 被破坏并重新创建) getUser()叫做。我不知道我是在 kotlin 方面犯了一些愚蠢的错误,还是在 Hilt 方面犯了一个愚蠢的错误。
知道发生了什么吗?

最佳答案

在你的情况下doOnEach调用onSuccessonComplete这意味着它调用了 2 次,第二次 it.value为空且 _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 }
}

关于android - 刀柄 : injecting application-wide repository singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63483676/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com