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

есть идеи, что происходит?


person jack_the_beast    schedule 19.08.2020    source источник
comment
второй раз что это значит? когда вы снова входите в действие, а приложение все еще работает, верно?   -  person Công Hải    schedule 19.08.2020
comment
да, это на самом деле фрагмент. Спасибо, что указали.   -  person jack_the_beast    schedule 19.08.2020


Ответы (1)


В вашем случае doOnEach вызов, когда 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 }
    }
person Công Hải    schedule 19.08.2020