【问题标题】:How to inject current activity in a collaborator using Dagger 2.11 Android injector如何使用 Dagger 2.11 Android 注入器在协作者中注入当前活动
【发布时间】: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 没有在我的应用代码中实例化。

标签: android dagger-2


【解决方案1】:

好的,终于找到问题所在了。 使用具有依赖项或子组件的组件我能够在BaseActivity 级别创建ActivityComponent,然后使用它将属性注入顶级活动。

这样,当我将Activity 注入协作者时,使用了保存当前活动的当前ActivityComponent。很简单。

Android Injector 的问题在于我们不再从代码中实例化ActivityComponent,而是AndroidInjector 发挥了作用,因此我们需要在自己的模块中提供每个Activity。

例如主要:

@Module
public abstract class MainActivityModule {
    @Provides
    @PerActivity
    static Activity provideActivity(MainActivity activity) {
        return activity;
    }
}

详情:

@Module
public abstract class DetailActivityModule {
    @Provides
    @PerActivity
    static Activity provideActivity(DetailActivity activity) {
        return activity;
    }
}

共同提供:

@Module
public abstract class ActivityModule {
    @Provides
    @PerActivity
    static ActColaborator provideActCollaborator() {
        return new ActColaborator();
    }
}

然后我们在 Main 中声明它们:

@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> {
    }
}

最后,我们可以在我们的共享协作者中注入当前活动:

private final Activity activity;

@Inject
public Navigator(Activity activity) {
    this.activity = activity;
}

【讨论】:

  • 您有没有找到一种方法来简单地提供Activity 而无需绑定MainActivity?即不这样做:静态活动提供活动(主活动活动){返回活动;我觉得必须有可能只公开 dagger-android 的东西已经以某种方式知道的 Activity 实例......
  • 是的,可以在BaseActivity中进行绑定,但是还是要在ActivityComponent上为每个Activity定义注入方法。但至少你的所有活动只有一个活动组件。看看我在 Github 上的 Dagger 游乐场:github.com/msesma/DaggerPlayground
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-06
  • 1970-01-01
  • 2018-03-31
  • 2018-03-09
  • 1970-01-01
相关资源
最近更新 更多