首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Dagger 2.1.0中向SubComponent builder添加外部依赖(上下文)

如何在Dagger 2.1.0中向SubComponent builder添加外部依赖(上下文)
EN

Stack Overflow用户
提问于 2017-10-29 04:21:44
回答 2查看 677关注 0票数 0

我根据google sample使用依赖注入。

我唯一可以传递的外部依赖项是通过AppComponent构建器

代码语言:javascript
复制
@Singleton
@Component(modules = {
        AndroidInjectionModule.class,
        AppModule.class,
        MainTabActivityModule.class,
        CoreActivityModule.class
})
public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }
    void inject(MyApplication myApplication);
}

并像这样注入到应用程序中

代码语言:javascript
复制
@Override
    public void onCreate() {
        super.onCreate();

DaggerAppComponent
                .builder()
                .application(myApplication)
                .build().inject(myApplication);
...
}

根据文档,注入活动看起来像这样。我添加了我想要实现的目标。

代码语言:javascript
复制
public class YourActivity extends Activity {
  public void onCreate(Bundle savedInstanceState) {
    AndroidInjection
//.builder()                 THIS IS WHAT I WANT TO ACHIEVE
//.addActivityContext(this)  THIS IS WHAT I WANT TO ACHIEVE
//.build()                   THIS IS WHAT I WANT TO ACHIEVE
.inject(this);
    super.onCreate(savedInstanceState);
  }
}

但问题是如何向subComponent添加额外的参数。

代码语言:javascript
复制
@Subcomponent
public interface CoreActivitySubComponent extends AndroidInjector<CoreAppActivity> {
//    @Subcomponent.Builder
//    interface Builder {
//        Builder addContext(Context context) //did not work
//        CoreActivitySubComponent build();   //did not work
//    }

//==or using abstract class
//   in this option I do not know where to add parameter to this builder
    @Subcomponent.Builder
    public abstract class Builder extends AndroidInjector.Builder<CoreAppActivity> {


    }

}
EN

回答 2

Stack Overflow用户

发布于 2017-10-30 22:03:58

问题在于,Dagger 2.1.0方法AndroidInjection.inject(this);本应在活动和片段中使用,但没有提供任何构建器来添加外部依赖项。

我想创建依赖于活动/片段上下文的通用模块。

示例:

代码语言:javascript
复制
public class ToastController {

    private Context context;

    @Inject
    public ToastController(Context context) {
        this.context = context;
    }

    public void showToast(@StringRes int res) {
        Toast.makeText(context, context.getText(res), Toast.LENGTH_SHORT).show();;
    }
}

但我不能将其推广到只能提供一个上下文模式的级别,相反,我必须为使用此模块的每个单独的活动/片段创建绑定模块。

代码语言:javascript
复制
@Singleton
@Component(modules = {
        AndroidInjectionModule.class,
        AppModule.class,
        MainTabActivityModule.class,// IMPORTANT CLASS
})
public interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }
    void inject(MyApplication myApplication);
}

这是一个我为每个活动提供上下文模块的地方

代码语言:javascript
复制
@Module
public abstract class MainTabActivityModule 
    @ContributesAndroidInjector(modules = ContextMainTabActivityModule.class)//THIS MODULE
    abstract MainTabActivity contributeMainActivity();

}

上下文是使用@Binds注解提供的

代码语言:javascript
复制
@Module
public abstract class ContextMainTabActivityModule {
    @Binds
    abstract Context provideContext(MainTabActivity featureActivity);
}

=====================

这可以通过根据sample重写方法seedInstance来完成

我试过了,但对我不起作用。

代码语言:javascript
复制
@Subcomponent.Builder
    public abstract class Builder extends AndroidInjector.Builder<CoreAppActivity> {

        abstract Builder addContextModule(ContextModule contextModule);

        @Override
        public void seedInstance(CoreAppActivity instance) {
            addContextModule(new ContextModule(instance));
        }
    }

下一节课

代码语言:javascript
复制
@Module
public class ContextModule {

    private CoreAppActivity coreAppActivity;

    @Provides
    Context getContext() {
        return coreAppActivity.getBaseContext();
    }

    public ContextModule(CoreAppActivity coreAppActivity) {
        this.coreAppActivity = coreAppActivity;
    }

}
票数 0
EN

Stack Overflow用户

发布于 2017-10-31 18:41:42

您是否将ContextModule添加到您的@Subcomponent中,类似于this answer?我认为你的@Subcomponent应该是这样的:

代码语言:javascript
复制
@Subcomponent(module = {ContextModule.class})
interface MainTabActivityComponent extends AndroidInjector<CoreAppActivity> {
    @Subcomponent.Builder
    public abstract class Builder extends AndroidInjector.Builder<CoreAppActivity> {

        abstract Builder addContextModule(ContextModule contextModule);

        @Override
        public void seedInstance(CoreAppActivity instance) {
            addContextModule(new ContextModule(instance));
        }
    } 
}

最后,不要忘记在绑定模块中包含这个@Subcomponent

最后一个问题:这真的是必需的吗?我发现在Application上使用AndroidInjector以及ActivitiesFragments将在我注入它时为我提供正确的相应Context

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46994106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档