首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >组件中存在具有匹配键的dagger错误绑定

组件中存在具有匹配键的dagger错误绑定
EN

Stack Overflow用户
提问于 2021-11-03 00:07:05
回答 1查看 91关注 0票数 0

Dagger 2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/di/AppComponent.java:19: error: [Dagger/MissingBinding] ProductListFragment cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
public abstract interface AppComponent {
                ^
  A binding with matching key exists in component: MainFragmentProvider_BindProductListFragment.ProductListFragmentSubcomponent
      ProductListFragment is injected at
          productlist.ProductListModule.provideChildFragmentManager(productListFragment)
      androidx.fragment.app.FragmentManager is injected at
          productlist.adapter.NewProductListPagerAdapter(, fragmentManager)
      productlist.adapter.NewProductListPagerAdapter is injected at
          productlist.ProductListV2Fragment.mPagerAdapter
      productlist.ProductListV2Fragment is injected at
          dagger.android.AndroidInjector.inject(T) [di.AppComponent → di.BuilderModule_BindMainActivity.MainActivitySubcomponent →  MainFragmentProvider_BindProductListV2Fragment.ProductListV2FragmentSubcomponent]

我有以下模块,其中包含这两个片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Module
abstract class FragmentProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [ProductListModule::class])
    abstract fun bindProductListV2Fragment(): ProductListV2Fragment
    
    @PerFragment
    @ContributesAndroidInjector(modules = [ProductListModule::class])
    abstract fun bindProductListFragment(): ProductListFragment
}

在我的ProductListModule中,我有以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Module
class ProductListModule {

    @Provides
    fun provideChildFragmentManager(productListFragment: ProductListFragment) =
        productListFragment.childFragmentManager
}

fragmentManager将被注入到以下类中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class NewProductListPagerAdapter @Inject constructor(
    @ActivityContext private val context: Context,
    fragmentManager: FragmentManager
) { ..... }

这两个片段都会将这个NewProductListPagerAdapter注入其中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ProductListV2Fragment  : BaseProductListFragment() {

    @Inject
    lateinit var mPagerAdapter: NewProductListPagerAdapter
}

class ProductListFragment  : BaseProductListFragment() {

    @Inject
    lateinit var mPagerAdapter: NewProductListPagerAdapter
}

我的AppComponent:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Singleton
@Component(
    modules = [
        AndroidSupportInjectionModule::class,
        AppModule::class,
        ProductModule::class,
        BaseAppModule::class
    ]
)
interface AppComponent {
    @Component.Factory
    interface Factory {
        fun create(
            @BindsInstance application: Application,
        ): AppComponent
    }

    fun inject(tsApplication: TsApplication)
}

====更新====

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Module
abstract class FragmentProvider {

    @PerFragment
    @ContributesAndroidInjector(modules = [ProductListModule::class, ProductListBindingModule::class])
    abstract fun bindProductListFragment(): ProductListFragment


    @PerFragment
    @ContributesAndroidInjector(modules = [ProductListModule::class, ProductListV2BindingModule::class])
    abstract fun bindProductListV2Fragment(): ProductListV2Fragment
}

@Module
class ProductListModule {

    @Provides
    fun provideChildFragmentManager(productListFragment: Fragment): FragmentManager =
        productListFragment.childFragmentManager
}


@Module
abstract class ProductListBindingModule {
    @Binds
    abstract fun bindFragment(fragment: ProductListFragment): Fragment
}

@Module
abstract class ProductListV2BindingModule {
    @Binds
    abstract fun bindFragment(fragment: ProductListV2Fragment): Fragment
}

堆栈跟踪在下面,这表明片段被多次绑定。原因是因为每个片段都注入了以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Inject
lateinit var mPagerAdapter: NewProductListPagerAdapter

在NewProductListPagerAdapter构造函数中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class NewProductListPagerAdapter @Inject constructor(
    @ActivityContext private val context: Context,
    fragmentManager: FragmentManager
)

它需要提供FragmentManager;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
app/build/tmp/kapt3/stubs/uatDebug/tech/central/tops/di/AppComponent.java:22: error: [Dagger/DuplicateBindings] androidx.fragment.app.Fragment is bound multiple times:
public abstract interface AppComponent {
      @org.jetbrains.annotations.NotNull @Binds androidx.fragment.app.Fragment productlist.ProductListBindingModule.bindFragment(productlist.ProductListFragment)
      @org.jetbrains.annotations.NotNull @Binds androidx.fragment.app.Fragment productlist.ProductListV2BindingModule.bindFragment(productlist.ProductListV2Fragment)
      androidx.fragment.app.Fragment is injected at
          authentication.usecase.FacebookLoginUseCase(fragment,)
      authentication.usecase.FacebookLoginUseCase is injected at
          authentication.usecase.SocialLoginUseCase(, facebookLoginUseCase,)
      authentication.usecase.SocialLoginUseCase is injected at
          authentication.FacebookLoginViewModel(, socialLoginUseCase,)
      authentication.FacebookLoginViewModel is injected at
          authentication.FacebookLoginViewModelModule.facebookViewModelChildFactory(facebookLoginViewModel)
      java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
          di.factory.ViewModelProviderFactory(classToViewModel)
      di.factory.ViewModelProviderFactory is injected at
          .authentication.login.LoginFragment.mViewModelChildFactory
      authentication.login.LoginFragment is injected at
          dagger.android.AndroidInjector.inject(T) [tech.central.tops.di.AppComponent → di.BuilderModule_BindMainActivity.MainActivitySubcomponent → FragmentProvider_BindLoginFragment.LoginFragmentSubcomponent]
EN

回答 1

Stack Overflow用户

发布于 2021-11-05 12:51:50

您的模块依赖于ProductListFragment来获取一个子FragmentManager。但是,相同模块也用于注入ProductListV2Fragment,此时没有可用的ProductListFragment

为了重用该模块,您需要将对ProductListFragment的依赖拆分为单独的模块。此模块应用于ProductListFragment,类似的模块应用于ProductListV2Fragment。在这些模块中,您可以直接提供FragmentManager,也可以将这两个片段绑定到一个公共超类,如FragmentBaseProductListFragment

如果将两个片段都绑定到Fragment,结果代码将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Module
abstract class FragmentProvider {
    @PerFragment
    @ContributesAndroidInjector(modules = [
        ProductListModule::class,
        ProductListV2BindingModule::class
    ])
    abstract fun bindProductListV2Fragment(): ProductListV2Fragment
    
    @PerFragment
    @ContributesAndroidInjector(modules = [
        ProductListModule::class,
        ProductListBindingModule::class
    ])
    abstract fun bindProductListFragment(): ProductListFragment
}

@Module
class ProductListModule {

    @Provides
    fun provideChildFragmentManager(productListFragment: Fragment) =
        productListFragment.childFragmentManager
}

@Module
abstract class ProductListBindingModule {
    @Binds
    fun bindFragment(fragment: ProductListFragment): Fragment
}

@Module
abstract class ProductListV2BindingModule {
    @Binds
    fun bindFragment(fragment: ProductListV2Fragment): Fragment
}

至于错误消息本身,它告诉您三件事:

  • 生成的ProductListV2FragmentSubcomponent需要ProductListFragment,但它没有可用的绑定。
  • 该子组件可能能够将依赖项注入现有的ProductListFragment。这在其他情况下可能是有用的信息,但它与您正在尝试做的事情无关。
  • 您的应用程序中有一个组件可以提供ProductListFragment。具体地说,这是生成的ProductListFragmentSubcomponent,它在其工厂中接受一个ProductListFragment
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69821456

复制
相关文章
从零开始匹配vim(2)——快捷键绑定
如果说 vim有什么最吸引人,我想vim允许你自由的定义各种快捷键算是一个原因吧。你可以通过绑定各种快捷键来使经常使用的功能更加便利。通俗的讲,快捷键映射就是我按下某个键,我想让vim将它当成另一个键,例如我按下 k,我想让vim把它当做 c 来使用(当然这么映射会把人逼疯)
Masimaro
2022/08/04
8790
从零开始匹配vim(2)——快捷键绑定
21 vue 组件中 Class 的绑定
对于样式类的绑定,使用v-bind就能满足需求,但vue为class的绑定作了特别的优化。
LIYI
2020/02/13
1.6K0
21 vue 组件中 Class 的绑定
Sublime Text 中的SublimeREPL的绑定快捷键配置
因为在配置python的Sublime Text环境,所以以python为例说明。
望天
2018/08/02
1.2K0
React组件方法中为什么要绑定this
上例仅仅是一个组件类的定义,当在其他组件中调用或是使用ReactDOM.render( )方法将其渲染到界面上时会生成一个组件的实例,因为组件是可以复用的,面向对象的编程方式非常适合它的定位。根据this指向的基本规则就可以知道,这里的this最终会指向组件的实例。
大史不说话
2019/03/01
8720
Javascript中对象如何检查key(键)是否存在
如果要特别测试对象实例的属性(而不是继承的属性),请使用hasOwnProperty:
IT工作者
2022/02/09
26.7K0
找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。
找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。
liulun
2022/05/09
7500
找不到具有绑定 NetTcpBinding 的终结点的与方案 net.tcp 匹配的基址。注册的基址方案是 [http]。
mysql正则匹配中文时存在的问题
然后我去看了下mysql的中文文档中关于正则表达式的部分(https://www.mysqlzh.com/doc/233.html)
用户1214487
2020/06/19
2.4K0
mysql正则匹配中文时存在的问题
[译] 依赖注入在多模块工程中的应用
总的来说,这不是一篇关于依赖注入的文章,也不是关于我们为什么选择库 X 而不是库 Y 的文章。 相反的,本文从依赖注入的角度介绍了我们对 Plaid 进行模块化实践的主要成果。
Android 开发者
2022/09/20
1.8K0
[译] 依赖注入在多模块工程中的应用
提示[译] 依赖注入在多模块工程中的应用
总的来说,这不是一篇关于依赖注入的文章,也不是关于我们为什么选择库 X 而不是库 Y 的文章。 相反的,本文从依赖注入的角度介绍了我们对 Plaid 进行模块化实践的主要成果。
Android 开发者
2019/06/02
1.7K0
vscode 快捷键绑定
最近迷上了vscode,用它开发.netcore程序十分方便,智能提示也很好用,插入智能提示的选项是enter键或者tab键,可惜我以前习惯使用vs写c#,习惯用空格做智能提示的选择,多方查找资料甚至准备采用开发一个vscode插件的方式解决,后来无意间查看官方文档,利用vscode的快捷键绑定功能是可以做到的。
全栈程序员站长
2022/08/30
3190
Dagger Android支持库(译文)
与其他依赖注入框架相比,Dagger 2 最大的优点是他不使用反射,严格的生成实现类,这意味着他可以使用在 Android 应用上。但是在Android上使用仍有一些注意事项。
haifeiWu
2018/09/11
9810
Android Hilt实战初体验: Dagger替换成Hilt
在组件化AwesomeGithub项目中使用了Dagger来减少手动依赖注入代码。虽然它能自动化帮我们管理依赖项,但是写过之后的应该都会体会到它还是有点繁琐的。项目中到处充斥着Component,这让我想起了传统MVP模式的接口定义。
Rouse
2020/07/21
1.8K0
VUE组件封装_vue组件内部双向绑定
官方:一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件。
全栈程序员站长
2022/11/09
8440
VUE组件封装_vue组件内部双向绑定
初学Dagger之Hello Dagger(0)
写作背景 这几天在学习Dagger、MVP、Agera,这里所说的Dagger即Google接手的Dagger,也被称作Dagger 2。跟着demo与一些技术博客学习,发现对于一个未曾使用过类似框架的人来说上手很困难,因此撰 初学Dagger 系列学习笔记,以一名初学者的视角来分享自己的学习经验,希望让大家上手更顺利。本文集将随Winter的学习进度更新。
冰之角
2018/09/04
4390
初学Dagger之Hello Dagger(0)
oracle绑定变量使用方法总结_绑定变量不存在
大家好,又见面了,我是你们的朋友全栈君。 String sql=“select * from users where username=? and pwd=?”; pstat=con.prepare
全栈程序员站长
2022/10/03
7870
MVPArms MVP快速集成框架
原文地址: http://www.jianshu.com/p/48e66e879061
用户2965681
2018/09/13
3.4K0
在 Kotlin 中使用 Dagger 会遇到的陷阱和优化方法
Dagger 在 Android 开发中相当流行,它是一个提供完全静态和在编译时生成代码的依赖注入框架,它解决了很多基于反射而实现的方案中所遇到的开发和性能问题。
Android 开发者
2022/09/23
1.1K0
又一个前端框架 - dagger.js
推荐一个轻量完备的开源前端框架:dagger.js:https://daggerjs.org
zz_jesse
2022/10/27
2.5K0
Hilt-依赖注入框架上手指南
Hilt 是Google 最新的依赖注入框架,其是基于Dagger研发,但它不同于Dagger。对于Android开发者来说,Hilt可以说专门为Android 打造,提供了一种将Dagger依赖项注入到Android应用程序的标准方法,而且创建了一组标准的组件和作用域,这些组件会自动集成到Android应用程序的各个生命周期中,以简化开发者的上手难度。
Petterp
2022/02/09
1.8K0
Hilt-依赖注入框架上手指南
Java中的静态绑定和动态绑定
一个Java程序的执行要经过编译和执行(解释)这两个步骤,同时Java又是面向对象的编程语言。当子类和父类存在同一个方法,子类重写了父类的 方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢,这应该是我们在初学Java时遇到的问题。这里首先我们将确定这种调用何种方法实现或 者变量的操作叫做绑定。
哲洛不闹
2018/09/19
2.1K0

相似问题

组件中存在具有匹配键的绑定: dagger 2.12

12

Dagger 2.11 -组件中存在具有匹配键的绑定

10

Dagger 2组件中存在具有匹配键的绑定

126

匕首:组件中存在具有匹配键的绑定。

10

Dagger2 -多模块-组件中存在具有匹配密钥的绑定

17
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文