【问题标题】:Hilt: injecting application-wide repository singletonHilt:注入应用程序范围的存储库单例
【发布时间】:2020-08-19 09:10:57
【问题描述】:

我对 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 方面犯了一个愚蠢的错误。

知道发生了什么吗?

【问题讨论】:

  • “第二次”是什么意思?当您再次进入活动并且应用程序还活着的时候,对吗?
  • 是的,它实际上是一个片段。感谢您指出。

标签: android viewmodel dagger dagger-hilt


【解决方案1】:

在您的情况下,doOnEachonSuccessonComplete 时调用,这意味着它调用了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 }
    }

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2013-09-03
    相关资源
    最近更新 更多