gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:11:32 25 4
gpt4 key购买 nike

我有一个小场景,我有以下结构,我试图在 baseActivity Fragment 中注入(inject) 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 Dagger 中提供了我的 fragment 管理器,也会抛出以下错误。我什至尝试只使用 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

最佳答案

“组件中存在具有匹配键的绑定(bind)”意味着您在整个对象图中的某处绑定(bind)了一个依赖项,但无法从需要注入(inject)它的子组件到达它。

Sibling component contains the binding that the user wants

这是 javadoc :

Utility code that looks for bindings matching a key in all subcomponents in a binding graph so that a user is advised that a binding exists elsewhere when it is not found in the current subgraph. If a binding matching a key exists in a sub- or sibling component, that is often whatthe user actually wants to use.

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

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

现在,您可以通过在 ABCActivity 的子组件中绑定(bind) FragmentManager 来修复错误:

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

关于android - Dagger 2.11 - 组件中存在具有匹配键的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47106818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com