泛型类MyActivity的Dagger依赖注入问题求助
解决Dagger @ContributesAndroidInjector与泛型Activity的注入问题
这个问题我之前也碰到过,Dagger的@ContributesAndroidInjector确实对泛型类的支持有严格限制,不过不用修改原有架构就能解决,给你两个可行的方案:
方案1:创建非泛型子类(推荐,最简单)
Dagger不允许@ContributesAndroidInjector返回参数化类型,但可以正常处理非泛型的子类——我们只需要给泛型MyActivity创建一个指定了具体泛型类型的子类,作为Dagger注入的“载体”,完全不影响原有架构的逻辑。
步骤1:创建非泛型子类
这个子类只是一个空壳,不需要添加任何额外业务逻辑:
// 继承泛型Activity并指定具体类型 public class ConcreteMyActivity extends MyActivity<AbstractDescriptionItem> { // 无需额外代码,直接继承即可 }
步骤2:修改Dagger模块的注入配置
把原来的@ContributesAndroidInjector指向这个子类:
@ContributesAndroidInjector abstract ConcreteMyActivity contributeConcreteMyActivity();
之后启动Activity时,直接启动ConcreteMyActivity就可以了——原来MyActivity的所有逻辑都会被继承,依赖注入也能正常工作。如果需要支持多种泛型参数,只要为每种参数创建对应的子类并添加对应的@ContributesAndroidInjector即可。
方案2:手动实现AndroidInjector.Factory(适合不想创建子类的场景)
如果不想创建子类,可以手动编写注入器工厂,绕开@ContributesAndroidInjector的限制:
步骤1:在Dagger模块中绑定注入器工厂
@Module public abstract class MyActivityModule { @Binds @IntoMap @ActivityKey(MyActivity.class) abstract AndroidInjector.Factory<? extends Activity> bindMyActivityInjectorFactory(MyActivityInjectorFactory factory); }
步骤2:实现注入器工厂和注入组件
public class MyActivityInjectorFactory implements AndroidInjector.Factory<MyActivity<AbstractDescriptionItem>> { // 注入所需依赖的提供者(Dagger会自动提供) private final Provider<YourDependency> yourDependencyProvider; @Inject public MyActivityInjectorFactory(Provider<YourDependency> yourDependencyProvider) { this.yourDependencyProvider = yourDependencyProvider; } @Override public AndroidInjector<MyActivity<AbstractDescriptionItem>> create(MyActivity<AbstractDescriptionItem> instance) { return new MyActivityInjector(instance); } // 内部类实现具体的注入逻辑 private class MyActivityInjector implements AndroidInjector<MyActivity<AbstractDescriptionItem>> { private final MyActivity<AbstractDescriptionItem> targetActivity; private final YourDependency yourDependency; MyActivityInjector(MyActivity<AbstractDescriptionItem> targetActivity) { this.targetActivity = targetActivity; this.yourDependency = yourDependencyProvider.get(); } @Override public void inject(MyActivity<AbstractDescriptionItem> instance) { // 手动为Activity注入依赖 targetActivity.yourDependency = yourDependency; // 其他需要注入的成员变量同理处理 } } }
这样Dagger就能正确识别MyActivity的注入逻辑,同时不需要修改原有泛型Activity的结构。
内容的提问来源于stack exchange,提问作者lex
相关产品推荐
相关产品推荐

