我曾经注入了一些协作者的当前活动或活动上下文,这些协作者由注入父活动的几个活动(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);
.....
答案 0 :(得分:1)
好的,终于找到了问题所在。
使用具有依赖关系或子组件的组件,我能够在AllowSpecialKeys
级别创建ActivityComponent
,然后使用它将属性注入顶级活动。
Thas方式,当我向合作者注入BaseActivity
时,使用了持有当前活动的当前Activity
。容易。
Android Injector的问题是我们不再从代码中实例化ActivityComponent
,它是ActivityComponent
谁做了魔法,所以我们需要在自己的模块中提供每个Activity。
例如Main:
AndroidInjector
详情:
@Module
public abstract class MainActivityModule {
@Provides
@PerActivity
static Activity provideActivity(MainActivity activity) {
return activity;
}
}
Common提供:
@Module
public abstract class DetailActivityModule {
@Provides
@PerActivity
static Activity provideActivity(DetailActivity activity) {
return activity;
}
}
然后我们在Main中声明它们:
@Module
public abstract class ActivityModule {
@Provides
@PerActivity
static ActColaborator provideActCollaborator() {
return new ActColaborator();
}
}
详情:
@PerActivity
@Subcomponent(modules = { ActivityModule.class, MainActivityModule.class})
public interface MainActivityComponent extends AndroidInjector<MainActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MainActivity> {
}
}
最后,我们可以在共享协作者中注入当前活动:
@PerActivity
@Subcomponent(modules = { ActivityModule.class, DetailActivityModule.class})
public interface DetailActivityComponent extends AndroidInjector<DetailActivity> {
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<DetailActivity> {
}
}