Android Dagger2触发[Dagger/MissingBinding] Activity注入绑定缺失报错
问题原因
- 你的
ApplicationComponent没有引入Dagger Android核心的AndroidInjectionModule,这个模块负责提供你注入ActivityInjector需要的Map<Class<? extends Activity>, Provider<AndroidInjector.Factory<? extends Activity>>类型的绑定容器,没有这个模块Dagger没法识别你@Binds @IntoMap @ClassKey标注的Activity注入工厂绑定。 - 次要问题1:
TrendingReposComponent里的Builder类名是小写的builder,不符合Java类名大驼峰规范,会导致后续Controller注入绑定失败。 - 次要问题2:
ActivityBindingModule里绑定MainActivity注入工厂的方法名provideMainActivtyInjector存在拼写错误(Activty少了字母i),虽不影响运行但建议修正。
解决方案
- 修改
ApplicationComponent的@Component注解,添加AndroidInjectionModule到modules列表:
@Singleton @Component(modules = { AndroidInjectionModule.class, // 新增这行 ApplicationModule.class, ActivityBindingModule.class, }) public interface ApplicationComponent { void inject(A myApplication); }
- 修正
TrendingReposComponent的Builder类名:
@ScreenScope @Subcomponent public interface TrendingReposComponent extends AndroidInjector<TrendingReposController> { // 把小写的builder改成大写Builder @Subcomponent.Builder abstract class Builder extends AndroidInjector.Builder<TrendingReposController>{ } }
- 对应修正
MainScreenBindingModule里引用Builder的地方:
@Module(subcomponents = { TrendingReposComponent.class, }) public abstract class MainScreenBindingModule { @Binds @IntoMap @ControllerKey(TrendingReposController.class) // 把TrendingReposComponent.builder改成TrendingReposComponent.Builder abstract AndroidInjector.Factory<? extends Controller> bindingTrendingReposInjector(TrendingReposComponent.Builder builder); }
- (可选)修正
ActivityBindingModule里的拼写错误:
@Module(subcomponents = { MainActivityComponent.class, }) public abstract class ActivityBindingModule { @Binds @IntoMap @ClassKey(MainActivity.class) // 把Activty改成Activity abstract AndroidInjector.Factory<? extends Activity> provideMainActivityInjector(MainActivityComponent.Builder builder); }
修改完成后clean项目重新编译即可解决该绑定错误。
内容的提问来源于stack exchange,提问作者user2654276
相关产品推荐
相关产品推荐

