Dagger-为SubComponent Builder设置动态值

时间:2018-07-26 13:12:41

标签: android dependency-injection dagger-2 dagger

我想在构建子组件构建器时为其设置一个值。如果只考虑简单的Dagger 2,我们可以实现以下目标:

@UserScope
@Subcomponent(modules = {UserModule.class, ActivityBuilder.class, NewEditQuotationModule.class})

public interface UserComponent {
NewEditQuotationComponent.Builder getNewEditQuotationComponent();
void inject(UserManager userManager);

@Subcomponent.Builder
interface Builder {
    @BindsInstance
    Builder user(User user);

    UserComponent build();
}}

但是对于Dagger Android,子组件及其关联的构建器由@ContributesAndroidInjector处理。 Dagger自动生成子组件及其构建器,甚至是在当前上下文中的实现。

我想在构建My Dagger Android Subcomponent时设置一些值。我尝试了以下方法:

 @Subcomponent(modules = NewEditQuotationModule.class)
    public interface NewEditQuotationComponent extends AndroidInjector<InquiriesEditNewMainActivity> {


    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<InquiriesEditNewMainActivity> {
        @BindsInstance
        public abstract Builder setName(@Named("My_Name") String name);
    }}

        @Module
    public abstract class NewEditQuotationModule {
        @Binds
        @IntoMap
        @ActivityKey(InquiriesEditNewMainActivity.class)
        abstract AndroidInjector.Factory<? extends Activity>
        bindInquiriesEditNewMainActivityInjectorFactory(NewEditQuotationComponent.Builder builder);

    }

我厌倦了通过以下方式来构建它:

AndroidInjector.Builder androidInjector = MyApplication
                .getApplication()
                .getAppComponent()
                .getApiEndPoint()
                .getApiEndPointComponent()
                .getUserManager()
                .getUserComponent()
                .getNewEditQuotationComponent().setName("My Name");
        androidInjector.seedInstance(this);
        androidInjector.build();

但没有成功。 请让我知道

  1. 在构建组件时如何设置一些值?
  2. 在以前的方法中我哪里出错了?

1 个答案:

答案 0 :(得分:1)

dagger.android的工作方式是在onCreate中自动创建您的组件,并且需要这种方式工作,因为允许Android自行创建您的Activity。预创建您的AndroidInjector将不起作用;那是您以前的方法的问题所在。

正如我试图通过重复问题投票所表明的那样,您在dagger.android中设置模块实例或@BindsInstance值的唯一方法是通过overriding the seedInstance method in the AndroidInjector.Builder作为您的{{1} }。这样一来,您就可以将值从“活动”实例中拉出并在“活动”图中进行设置。

尽管您始终可以将数据存储在@Subcomponent.Builder(ApplicationComponent作用域)对象或VM全局变量中,但是您正在尝试通过正确地将数据从Activity传递到Activity而不设置全局状态来做正确的事情。 我认为这是正确的方法,但您的解决方案可能不会涉及显式构造AndroidInjector 。而是使用pass your data through the extras bundle,这是一种将参数和其他数据传输到“活动”中的惯用方式;然后,您可以将数据从getIntent() should be populated by the time onCreate(Bundle) runs开始,从@Singleton中的Activity实例上的getIntent().getExtras()中拉出,插入到图形中。