Android使用Hilt时如何限制依赖作用域仅对指定Activity生效?
问题根因
你当前将CurrencyModule安装到了通用的ActivityComponent中,这意味着所有Activity的组件都可以访问该模块提供的CurrencyRatesAdapter依赖,所以任意Activity都能注入这个适配器实例,不符合你的预期。
解决方案
根据你的使用场景可以选择以下两种方案:
方案1:将模块安装到指定Activity(最适配你的需求)
Hilt支持直接将模块安装到特定的加了@AndroidEntryPoint的Activity组件中,安装后该模块提供的依赖仅能被对应Activity访问,其他组件无法注入。
修改你的CurrencyModule的@InstallIn注解参数,直接传入你要限制的Activity类名即可:
import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.scopes.ActivityScoped // 替换为你实际的ActivityA的类名,不再使用通用的ActivityComponent @Module @InstallIn(ActivityA::class) class CurrencyModule { @Provides @ActivityScoped // 可选添加,需要整个ActivityA生命周期内复用同一个适配器实例时再加 fun provideCurrencyAdapter(): CurrencyRatesAdapter { return CurrencyRatesAdapter(mutableListOf()) } }
配置完成后,只有ActivityA可以注入CurrencyRatesAdapter,ActivityB尝试注入该实例会直接编译报错,完全满足作用域限制要求。
方案2:使用Qualifier限定符(适合同类型多实例区分场景)
如果你后续需要在多个Activity注入同类型的不同实例,可以通过自定义限定符做区分:
- 首先定义自定义限定符注解
@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ForActivityA @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ForActivityB
- 在Module中用限定符标记不同的实例提供方法
@Module @InstallIn(ActivityComponent::class) class AdapterModule { @Provides @ForActivityA fun provideAdapterA(): CurrencyRatesAdapter = CurrencyRatesAdapter(mutableListOf()) @Provides @ForActivityB fun provideAdapterB(): OtherAdapter = OtherAdapter(mutableListOf()) }
- 注入时加上对应限定符
ActivityA中注入:
@Inject @ForActivityA lateinit var currencyRatesAdapter: CurrencyRatesAdapter
ActivityB中注入另一个适配器:
@Inject @ForActivityB lateinit var otherAdapter: OtherAdapter
该方案不会强制限制注入位置,需要开发者主动添加对应限定符才能拿到正确实例,适合多实例区分场景。
内容的提问来源于stack exchange,提问作者Syed Tehrim
相关产品推荐
相关产品推荐

