【问题标题】:Dagger 2.11 - A binding with matching key exists in componentDagger 2.11 - 组件中存在具有匹配键的绑定
【发布时间】:2023-03-03 23:34:01
【问题描述】:

我有一个小场景,我有以下结构,我试图在 baseActivity Fragment 中注入片段管理器,但由于某种原因我运气不好:(

@Singleton
@Component(modules = { AppModule.class,
        ActivityModule.class,
        AndroidSupportInjectionModule.class })
public interface AppComponent extends AndroidInjector<App> {

    @Override
    void inject(App application);

    @Component.Builder interface Builder {

        @BindsInstance
        AppComponent.Builder application(App application);

        AppComponent build();
    }
}

ActivityModule.class

@PerActivity
@ContributesAndroidInjector(modules = BaseActivityModule.class)
abstract BaseActivity baseActivity();

BaseActivityModule.class

static final String ACTIVITY_FRAGMENT_MANAGER = "ACTIVITY_FRAGMENT_MANAGER";

@PerActivity
@Named(ACTIVITY_FRAGMENT_MANAGER)
@Provides
static FragmentManager activityFragmentManager(BaseActivity activity) {
    return activity.getSupportFragmentManager();
}

BaseAcitivity.class

public abstract class BaseActivity extends DaggerAppCompatActivity {

    @Named(ACTIVITY_FRAGMENT_MANAGER)
    @Inject
    FragmentManager fragmentManager;
}

因此,即使我在 BaseActivityModule.class 中提供我的片段管理器,匕首也会引发以下错误。我什至尝试只使用 Activity 而不是 BaseActivity 作为 BaseActivityModule 中的输入参数。即便如此,我也遇到了同样的问题。不知道我到底在搞砸什么。所以任何帮助表示赞赏。在此先感谢:)

Error:(17, 8) error: [dagger.android.AndroidInjector.inject(T)] @javax.inject.Named("ACTIVITY_FRAGMENT_MANAGER") android.support.v4.app.FragmentManager cannot be provided without an @Provides- or @Produces-annotated method.
@javax.inject.Named("ACTIVITY_FRAGMENT_MANAGER") android.support.v4.app.FragmentManager is injected at
com.abc.views.base.BaseActivity.fragmentManager
com.abc.views.def.ABCActivity is injected at
dagger.android.AndroidInjector.inject(arg0)
A binding with matching key exists in component: om.abc.views.base.BaseActivity_BaseActivity.BaseActivitySubcomponent

【问题讨论】:

  • 您如何/注射什么?我猜您正在使用除单个 BaseActivity 之外的其他活动。您必须提供来自其组件的依赖项,BaseActivity 会被忽略

标签: android dependency-injection dagger-2 dagger


【解决方案1】:

“组件中存在具有匹配键的绑定”意味着您已在整个对象图中的某处绑定了一个依赖项,但无法从需要注入它的子组件访问它。这是javadoc

在绑定图中的所有子组件中查找与键匹配的绑定的实用程序代码,以便在当前子图中未找到绑定时建议用户在其他地方存在绑定。如果与键匹配的绑定存在于子组件或兄弟组件中,这通常是 用户实际想要使用。

例如,假设您有两个活动,ActivityAActivityB。您使用@ContributesAndroidInjector 生成子组件并在ActivityA 模块中绑定Foo,而不是ActivityB 模块。如果您在 ActivityB@Inject Foo foo 中请求 Foo 注入,您将收到该错误消息。

在像BaseActivity 这样的基类上使用@ContributesAndroidInjector 形成子组件在这里可能不是一个好方法。就像David Medenjak 的评论一样,基类的子组件将被忽略,具体类的子组件将在ABCActivity 上执行注入。

目前,您可以通过在 ABCActivity 的子组件中绑定 FragmentManager 来修复错误:

@PerActivity
@ContributesAndroidInjector(modules = BaseActivityModule.class)
abstract ABCActivity ABCActivity();

【讨论】:

  • 我明白你的意思。如果我不为BaseActivity 创建一个子组件并在我的ABCActivityModule.class 中将其用作@Module(includes = ABCActivityModule.class) 怎么办?它应该工作吗?当我尝试它时,它导致我出现同样的错误。
  • @user3354265 您可以尝试进行清理/重建吗?如果这不起作用,您可以发布您的ABCActivityModule吗?
  • 刚刚重建没有变化。 BaseActivity 模块同上。我仍在注入 baseActivity 但我只在我的 ABCActivityModule 中包含 BaseActivityModule ,看起来像这样。 @Module(includes = BaseActivityModule.class) public abstract class ABCActivityModule { @PerFragment @ContributesAndroidInjector abstract ABCFragment abcFragment(); } 另外,ABCActivity 扩展了 BaseActivity。所以我的主要要求是我想使用我的 ABCActivity 中的 addFragment ,我想在 BaseActivity 中注入 fragmentManager
  • @user3354265 你确定你提供的是与FragmentManager 相同的风格吗?也许您可以仔细检查导入语句。一个常见的错误是在其他地方使用android.Fragment.FragmentManager inandroid.support.v4.FragmentManager
  • 我已经检查过我正在使用支持一号。我认为它不喜欢在 baseActivity 中注入不完全确定为什么??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2018-03-31
  • 2013-03-07
  • 1970-01-01
相关资源
最近更新 更多