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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:15:03