如何使用Dagger 2.11 Android注入器在协作者中注入当前活动

时间:2017-06-22 13:47:12

标签: android dagger-2

我曾经注入了一些协作者的当前活动或活动上下文,这些协作者由注入父活动的几个活动(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);
.....

1 个答案:

答案 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> {
    }
}
相关问题