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并做映射:
- 创建LoginActivity的Subcomponent:
@LoginActivityScope @Subcomponent(modules = LoginActivityModule.class) public interface LoginActivitySubcomponent extends AndroidInjector<LoginActivity> { @Subcomponent.Factory interface Factory extends AndroidInjector.Factory<LoginActivity> {} } - 创建模块绑定
LoginActivity_到这个Subcomponent的Factory:@Module public abstract class AndroidAnnotationsActivityModule { @Binds @IntoMap @ActivityKey(LoginActivity_.class) abstract AndroidInjector.Factory<? extends Activity> bindLoginActivityInjectorFactory(LoginActivitySubcomponent.Factory factory); } - 把这个模块添加到
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
相关产品推荐
相关产品推荐

