Dagger2出现MissingBinding与DuplicateBindings绑定错误如何解决?
Dagger2两类绑定错误修复方案
1. MissingBinding错误原因与修复
错误原因
第一次报错是因为ProductListV2Fragment对应的子组件中,引入的ProductListModule需要注入ProductListFragment类型的实例,但ProductListV2Fragment的子组件里只有自身的绑定,没有ProductListFragment的绑定,所以找不到对应依赖。
修复代码
不要跨Fragment共用提供FragmentManager的Module,给两个Fragment分别配置专属的子组件Module:
// ProductListFragment专属Module @Module class ProductListFragmentModule { @Provides fun provideChildFragmentManager(fragment: ProductListFragment): FragmentManager = fragment.childFragmentManager @Provides fun providePagerAdapter(@ActivityContext context: Context, fragmentManager: FragmentManager) = NewProductListPagerAdapter(context, fragmentManager) } // ProductListV2Fragment专属Module @Module class ProductListV2FragmentModule { @Provides fun provideChildFragmentManager(fragment: ProductListV2Fragment): FragmentManager = fragment.childFragmentManager @Provides fun providePagerAdapter(@ActivityContext context: Context, fragmentManager: FragmentManager) = NewProductListPagerAdapter(context, fragmentManager) }
修改FragmentProvider的绑定逻辑,每个Fragment关联自己的专属Module:
@Module abstract class FragmentProvider { @PerFragment @ContributesAndroidInjector(modules = [ProductListV2FragmentModule::class]) abstract fun bindProductListV2Fragment(): ProductListV2Fragment @PerFragment @ContributesAndroidInjector(modules = [ProductListFragmentModule::class]) abstract fun bindProductListFragment(): ProductListFragment }
2. DuplicateBindings错误原因与修复
错误原因
第二次调整后,两个绑定Module都把不同的子类实例绑定到了Fragment父类,Dagger在全局扫描时发现有两个Fragment类型的绑定,而FacebookLoginUseCase需要注入Fragment类型依赖时,Dagger无法判断该用哪个实例,就报了重复绑定错误。
修复方案
如果确实需要绑定Fragment父类供其他地方注入,给不同的绑定加自定义限定符区分,避免全局冲突:
// 自定义限定符 @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ProductListFrag @Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ProductListV2Frag
修改绑定Module,给绑定加限定符:
@Module abstract class ProductListBindingModule { @Binds @ProductListFrag abstract fun bindFragment(fragment: ProductListFragment): Fragment } @Module abstract class ProductListV2BindingModule { @Binds @ProductListV2Frag abstract fun bindFragment(fragment: ProductListV2Fragment): Fragment }
注入对应Fragment时指定限定符即可:
// 示例:注入ProductListFragment实例 @Inject @ProductListFrag lateinit var productListFragment: Fragment
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

