Я относительно новичок в 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()
. Я не знаю, делаю ли я глупую ошибку на стороне котлина или глупую ошибку на стороне рукояти.
есть идеи, что происходит?