使用Support V4 Fragment时Dagger2的fragmentDispatchingAndroidInjector编译错误解决
你遇到的这个编译错误,本质是Dagger找不到Map<Class<? extends android.support.v4.app.Fragment>, AndroidInjector.Factory<? extends android.support.v4.app.Fragment>>的提供方——因为你用的是Support V4 Fragment,但你找到的代码是针对原生android.app.Fragment的,而且这个抽象方法也不是放在Activity里,而是要放在一个Dagger模块中。
下面是具体的解决步骤:
1. 创建专门的Support Fragment绑定模块
新建一个抽象模块类,用来告诉Dagger要生成Support Fragment对应的Injector Factory Map:
@Module public abstract class FragmentSupportModule { // 注意这里要用android.support.v4.app.Fragment,和你MainActivity中注入的类型一致 @Multibinds abstract Map<Class<? extends android.support.v4.app.Fragment>, AndroidInjector.Factory<? extends android.support.v4.app.Fragment>> bindSupportFragmentInjectorFactories(); }
这个@Multibinds注解的作用是:即使当前还没有绑定任何具体的Support Fragment,Dagger也会生成一个空的Map实例,避免编译报错;当你后续添加具体Fragment的注入配置时,Dagger会自动把对应的Injector Factory加入到这个Map中。
2. 将模块添加到AppComponent
修改你的AppComponent,把刚才创建的FragmentSupportModule加入到modules列表里:
@Singleton @Component(modules = { AndroidInjectionModule.class, AppModule.class, ActivityBuilder.class, FragmentSupportModule.class // 新增这个模块 }) public interface AppComponent { @Component.Builder interface Builder { @BindsInstance Builder application(Application application); AppComponent build(); } void inject(TVShowsApp app); }
3. 为具体的Support Fragment添加注入配置(如果有)
如果你有需要注入的Support Fragment(比如MainFragment),还要在Dagger模块中添加@ContributesAndroidInjector配置,比如可以在ActivityBuilder里扩展,或者单独创建一个FragmentBuilder模块:
// 示例:在ActivityBuilder中添加Fragment的注入配置 @Module public abstract class ActivityBuilder { @ContributesAndroidInjector(modules = {MainActivityModule.class, MainFragmentModule.class}) abstract MainActivity bindMainActivity(); } // 单独的MainFragmentModule @Module public abstract class MainFragmentModule { @ContributesAndroidInjector abstract MainFragment bindMainFragment(); }
验证你的MainActivity配置
你的MainActivity已经正确实现了HasSupportFragmentInjector,并且注入了DispatchingAndroidInjector<Fragment>(注意这里的Fragment必须是android.support.v4.app.Fragment,不要导入原生的android.app.Fragment),这部分是没问题的。
做完以上步骤后,重新编译项目,这个错误应该就会消失了~
内容的提问来源于stack exchange,提问作者Anton Makov

