【发布时间】:2017-06-23 16:42:22
【问题描述】:
我曾经在一些协作者上注入当前活动或活动上下文,这些协作者由注入父活动(BaseActivity 或 AppCompactActivity)的多个活动共享。 但由于某种原因,我不能使用 Dagger 2.11 Android Injector 来做到这一点。
这是我的活动模块:
@Module
public class ActivityModule {
private final Activity activity;
public ActivityModule(Activity activity) {
this.activity = activity;
}
@Provides
@PerActivity
ActColaborator provideActCollaborator() {
return new ActColaborator();
}
@Provides
@PerActivity
Activity provideActivity() {
return activity;
}
}
我尝试注入这些类:
@Inject
public Navigator(ActColaborator actColaborator,
BaseActivity activity) {
this.actColaborator = actColaborator;
this.activity = activity;
}
但我得到了一个
BaseActivity cannot be provided without an @Inject constructor or from an @Provides-annotated method.
如果我删除 BaseActivity 的东西,ActColaborator 会正确注入。
问题是 ActivityModule 不再像以前那样在 Activity 中实例化,而是将 Activity 本身传递给它:
//old, pre Android-injector code
this.activityComponent = getApplicationComponent()
.getActivityComponentBuilder()
.activityModule(new ActivityModule(this))
.build();
所以我不知道如何使当前活动可用于注入其协作者。
根据要求提供更多信息: 我为这三个活动设置了三个不同的组件类,但它们都像这样:
@PerActivity
@Subcomponent
public interface MainActivityComponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {
}
}
还有 ActivityBindingModule:
@Module(subcomponents = {
MainActivityComponent.class,
DetailActivityComponent.class,
AnotherActivityComponent.class
})
abstract public class ActivityBindingModule {
@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity> mainActivityInjectorFactory(
MainActivityComponent.Builder builder);
.....
【问题讨论】:
-
你也可以发布你的组件类吗?
-
在进一步调查后添加了更多信息。在 pre android-injector 模式下,activity 实例化了 ActivityModule 使得它可以很容易地传递给它当前的 Activity。使用 AndroidInjector 这是不可能的,因为 ActivityModule 没有在我的应用代码中实例化。