如何在Hilt中把ViewModelScope的IARepository注入Application类?
解决方案
问题本质是Hilt的组件层级限制:你把IARepository的绑定仅放在了ViewModelComponent的Module中,而TestApplication属于最顶层的SingletonComponent。Hilt的组件是分层结构,父组件(SingletonComponent)无法访问子组件(ViewModelComponent)内的绑定,因此触发了Dagger/MissingBinding错误。
下面是两种针对性的解决思路:
思路1:全局单例共享(适合Application和ViewModel共用同一实例的场景)
把提供IARepository的Module迁移到SingletonComponent,并改用@Singleton作用域。这样不仅Application能正常注入,ViewModel里的UseCase也能复用这个全局单例实例,完全满足你的原有需求。
修改后的Module代码:
@Module @InstallIn(SingletonComponent::class) object IARepositoryModule { @Singleton @Provides fun provideIARepository(): IARepository { return ARepository() } }
思路2:分组件提供不同绑定(适合Application和ViewModel需要不同作用域实例的场景)
如果ViewModel需要和自身生命周期绑定的ViewModelScoped实例,而Application需要全局单例,可以拆分出两个Module,分别对应不同的组件:
给Application提供单例绑定的Module
@Module @InstallIn(SingletonComponent::class) object SingletonIARepositoryModule { @Singleton @Provides fun provideSingletonIARepository(): IARepository { return ARepository() } }
给ViewModel提供ViewModel作用域绑定的Module
@Module @InstallIn(ViewModelComponent::class) object ViewModelScopedIARepositoryModule { @ViewModelScoped @Provides fun provideViewModelScopedIARepository(): IARepository { return ARepository() } }
Hilt会自动根据注入的组件层级匹配对应的绑定,Application注入的是全局单例,ViewModel注入的是和自身生命周期绑定的实例。
内容的提问来源于stack exchange,提问作者Hado
相关产品推荐
相关产品推荐

