击中:注入应用程序范围内的存储库单例

jack_the_beast

我对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都注入的相同实例的问题是,_usernull(例如,视图被破坏并重新创建)在第二时间getUser()被调用。我不知道我是在Kotlin方面犯了一些愚蠢的错误,还是在Hilt方面犯了一个愚蠢的错误。

知道发生了什么吗?

丛海

在您的情况下,doOnEach调用whenonSuccessonComplete它表示调用了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 }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Android应用程序扫描范围内的蓝牙设备

我们如何在应用程序范围内存储数据以进行缓存?

如何在sqlalchemy范围内的会话中执行MySQL存储过程以返回单个数据集(用于flask Web应用程序)?

在全球范围内使用MBProgressHUD +使其单例

IIS 8:自定义应用程序池ID:值不在预期范围内

DryIoc和UseInstance导致“期望实例存储在单例范围内”异常

打字稿-应用程序范围内的状态(Singleton?)

会话范围的托管bean在xpages应用程序中似乎不在会话范围内

在应用程序范围内存储CFC用户内容处理程序是否安全?

使用ThreadPoolExecutor应用程序的ExecutorChannel的池大小是否在请求范围内

如何在应用程序范围内保留Socket.io套接字

如何在Qt应用程序中清理字符范围内的每个输入

在全球范围内公开wep应用程序功能-是或否?

Symfony2:如何添加应用程序范围内的自定义方法?

不运行且iBeacon在范围内时调用应用程序

在整个应用程序范围内根据标题切换渲染

MvvmCross应用程序范围内的NavigationDrawer实现xamarin.droid

在整个应用程序范围内,UIView动画间歇性地失败

ninject将iunitofwork注入到存储库范围内的属性

创建可在应用程序范围内访问的用户配置文件

应用程序[AWS CLI]命令快捷方式在全局范围内不起作用

如何给Web应用程序命名,以便在世界范围内访问

如何处理应用程序范围内可访问的字符串?

VB.net应用程序范围内的复制和粘贴(文本)

如何从特定范围内的信标唤醒应用程序?

为 simple_form 设置应用程序范围内的 input_html 值

如何创建可在应用程序范围内访问的上下文对象以在数据访问中存储当前用户详细信息?

我可以在单例范围内使用 KafkaTemplate 吗?

在固定范围内触发应用程序脚本功能