当前位置: 首页 > 知识库问答 >
问题:

HILT:注入应用程序范围的存储库单例

柯冯浩
2023-03-14

我对匕首比较陌生,我刚开始使用剑柄。我想要的是在viewmodel中注入一个应用程序范围的存储库(这意味着它需要在任何地方都是相同的对象)。存储库将用于检索用户、auth令牌和诸如此类的东西。这是我能找到的最接近的:

@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 } }
    }

}

这样一切都可以正常工作,使用debug我可以确认每次使用viewmodel时都注入了相同的userrepository实例。问题是第二次调用_usernull(例如,视图被销毁并重新创建)getuser()。我不知道我是在科特林一侧犯了什么愚蠢的错误,还是在剑柄一侧犯了什么愚蠢的错误。

你知道怎么回事吗?

共有1个答案

庞瀚
2023-03-14

在您的例子中,dooneach调用时onsuccessoncomplete,这意味着它调用了两次,第二次it.value为null,_user再次与null对齐。这不是来自hilt的bug

    private fun fetchUser(): Observable<User> {
        return Observable.just(User("foo", Random.nextDouble(100.00)))
            .delay(2, TimeUnit.SECONDS)
            .doOnEach { _user = it.value }
    }
 类似资料:
  • 现在我想转换,一个洞应用程序,我有房间,到这个干净的架构。在本教程中,Florian使用DI,将TaskDao注入到TaskViewModel,但我有一个存储库类。 所以我到了这样一个点,即应用程序的构建没有错误。 这是我的存储库: 然后,更改RepositoryModule,以匹配构造函数... 公共抽象类ATMDatabase扩展了AndroidX.room.RoomDatabase{^C:\

  • 众所周知,创建NSDate格式器是“昂贵的” 甚至苹果的数据格式指南(2014-02年更新)也指出: 创建日期格式化程序并不是一项廉价的操作。如果您可能经常使用格式化程序,缓存单个实例通常比创建和处理多个实例更有效。一种方法是使用静态变量。 但该文档似乎并不是swift的最新版本,我在最新的NSDateFormatter类参考中也找不到任何关于缓存格式化程序的信息,所以我只能假设swift和obj

  • 如何在扩展Activity而不是AppCompatActivity的类中注入改装实例?这是模块: 这是我的主要活动: 这导致 用@AndroidEntryPoint注释的活动必须是 androidx.activity.ComponentActivity 的子类。(例如 FragmentActivity、AppCompatActivity 等)[剑柄]处理未完成。有关详细信息,请参阅上面的错误。 我

  • 我想为带有存储库注释并属于我的包的类触发我的方面,例如: 我的类是这样创建的jpa存储库: )公共类DbConfig{ 我的方面是以下内容,但仅在我离开repository()切入点时激活,但如果我还指定应用程序包,它就不起作用: 我错过了什么? 编辑: 我想我明白了:问题是存储库的实现不属于我的应用程序包,而是属于spring的SimpleJPrepository。这就像aspect只处理实现,

  • 我一直在探索构建我的ColdFusion应用程序的不同方法,我正在寻找一些关于提供应用范围UDF的最佳方式的意见。 对于我的每一个应用程序,我通常都会使用一些不属于任何特定对象的额外功能。主要是数据操作。我希望这些功能在我的整个应用程序中都可用,既可以在CFM模板中使用,也可以在应用程序实例化的CFC中使用。 在我看来,有各种各样的方法来实现这一点,但它们都有自己的局限性: > 创建一个基本的Ut