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

Dagger与AndroidAnnotations集成报错:无MyActivity_注入工厂绑定

解决 No injector factory bound for Class<MyActivity_> 异常(AndroidAnnotations + Dagger 2)

我之前也踩过这个坑,核心原因非常明确:AndroidAnnotations(AA)会在编译时自动生成对应Activity的子类(比如你的LoginActivity会被生成LoginActivity_),但你在Dagger的ActivityBindingModule里只绑定了父类LoginActivity,而实际运行时启动的是AA生成的子类LoginActivity_,Dagger找不到这个子类的注入工厂,所以抛出了IllegalArgumentException。

下面是分步解决方案:

1. 先修复两个基础错误

这两个小问题不解决,后续调整也白搭:

  • 你的LoginActivity没有继承Android基础Activity类:@EActivity注解要求类必须继承Activity或AppCompatActivity,否则AA生成的子类会出现异常。修正代码:
    @EActivity(R.layout.activity_login)
    public class LoginActivity extends AppCompatActivity { // 添加继承关系
        @Inject
        LoginViewModel loginViewModel;
        @AfterViews
        void afterViews(){
            AndroidInjection.inject(this);
        }
    }
    
  • Application类名冲突:你把自定义Application命名为Application,这会和系统的android.app.Application完全冲突,必须重命名(比如MyApplication):
    @EApplication
    public class MyApplication extends DaggerApplication {
        @Inject
        DispatchingAndroidInjector<Activity> activityDispatchingAndroidInjector;
        
        @Override
        protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
            AppComponent appComponent = DaggerAppComponent.builder()
                    .application(this)
                    .build();
            appComponent.inject(this);
            return appComponent;
        }
    }
    

2. 让Dagger支持AA生成的Activity子类

因为实际运行的是LoginActivity_而不是LoginActivity,需要让Dagger为这个生成的子类绑定注入工厂,有两种可行方式:

方式一:直接绑定生成的子类(简单直接)

先执行一次项目编译(比如./gradlew compileDebugJavaWithJavac),让AA生成LoginActivity_类,然后修改ActivityBindingModule,把绑定的类型改为生成的子类:

@Module
public abstract class ActivityBindingModule {
    @ContributesAndroidInjector(modules = LoginActivityModule.class)
    @LoginActivityScope
    abstract LoginActivity_ bindLoginActivity(); // 改为AA生成的子类
}

注:如果IDE报红,编译后生成类就会自动识别了。

方式二:绑定父类与子类的映射(更优雅,避免依赖生成类)

如果你不想直接依赖AA生成的类,可以手动创建Subcomponent并做映射:

  1. 创建LoginActivity的Subcomponent:
    @LoginActivityScope
    @Subcomponent(modules = LoginActivityModule.class)
    public interface LoginActivitySubcomponent extends AndroidInjector<LoginActivity> {
        @Subcomponent.Factory
        interface Factory extends AndroidInjector.Factory<LoginActivity> {}
    }
    
  2. 创建模块绑定LoginActivity_到这个Subcomponent的Factory:
    @Module
    public abstract class AndroidAnnotationsActivityModule {
        @Binds
        @IntoMap
        @ActivityKey(LoginActivity_.class)
        abstract AndroidInjector.Factory<? extends Activity> bindLoginActivityInjectorFactory(LoginActivitySubcomponent.Factory factory);
    }
    
  3. 把这个模块添加到AppComponent的modules中:
    @Singleton @Component(modules = { 
        AndroidInjectionModule.class, 
        AppModule.class, 
        ActivityBindingModule.class,
        AndroidAnnotationsActivityModule.class // 添加新模块
    })
    public interface AppComponent extends AndroidInjector<MyApplication> {
        // ... 其余代码不变
    }
    

3. 可选优化:调整注入时机

把AndroidInjection.inject(this)从@AfterViews移到@BeforeViews,确保在视图初始化前完成注入,避免出现空指针:

@EActivity(R.layout.activity_login)
public class LoginActivity extends AppCompatActivity {
    @Inject
    LoginViewModel loginViewModel;
    
    @BeforeViews // 改为BeforeViews
    void beforeViews(){
        AndroidInjection.inject(this);
    }
    
    @AfterViews
    void afterViews(){
        // 这里可以安全使用loginViewModel了
    }
}

完成以上步骤后,重新编译运行,这个注入异常应该就能解决了。

内容的提问来源于stack exchange,提问作者aleksandrbel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:26:51