use*_*265 5 android dependency-injection dagger dagger-2
我有一个小场景,我有以下结构,我试图在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();
}
}
Run Code Online (Sandbox Code Playgroud)
ActivityModule.class
@PerActivity
@ContributesAndroidInjector(modules = BaseActivityModule.class)
abstract BaseActivity baseActivity();
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
BaseAcitivity.class
public abstract class BaseActivity extends DaggerAppCompatActivity {
@Named(ACTIVITY_FRAGMENT_MANAGER)
@Inject
FragmentManager fragmentManager;
}
Run Code Online (Sandbox Code Playgroud)
所以即使我在BaseActivityModule.class中提供我的片段管理器,dagger也会抛出以下错误.我甚至尝试使用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
Run Code Online (Sandbox Code Playgroud)
Dav*_*son 10
"组件中存在与匹配键的绑定"意味着您已在整个对象图中的某处绑定了一个依赖项,但无法从需要注入它的子组件中访问它.这是javadoc:
实用程序代码,用于查找与绑定图中所有子组件中的键匹配的绑定,以便在当前子图中找不到绑定时,建议用户在其他位置存在绑定.如果匹配键的绑定存在于子组件或兄弟组件中,那通常是用户实际想要使用的.
例如,假设您有两个活动,ActivityA
和ActivityB
.您可以使用模块生成子组件@ContributesAndroidInjector
并Foo
在ActivityA
模块中绑定,但不能在ActivityB
模块中生成.如果您要求注射Foo
在ActivityB
与@Inject Foo foo
你会得到错误信息.
@ContributesAndroidInjector
在基类上使用形成子组件BaseActivity
可能不是一个好方法.与David Medenjak的注释一样,基类的子组件将被忽略,具体类的子组件将执行注入ABCActivity
.
现在,您可以通过FragmentManager
在子组件中绑定来修复错误ABCActivity
:
@PerActivity
@ContributesAndroidInjector(modules = BaseActivityModule.class)
abstract ABCActivity ABCActivity();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5281 次 |
最近记录: |