You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

泛型类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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:04:18