dagger-2 – Dagger 2活动上下文/ ApplicationContext模块

我正在与匕首2挣扎,以便了解我如何根据自己的需要传递上下文.
– 首先我有一个ApplicationModule注释@Singleton,因为它提供高级对象,如webservice对象,模型……,通常那些对象传递给ApplicationContext(因为y需要在整个Application生命周期中存活)

@Singleton
@dagger.Component(modules = {
    AppModule.class
})
public interface AppComponent {
        void inject(MyApp application);
        Model model();
        Context context();<--- should provide the application Context for the Object above (model)
...

实现看起来像那样

@dagger.Module
public class AppModule {

    private final Application app;
    public ApplModule(Application app) {
        this.app = app;
    }

    @Provides
    @Singleton
    Model provideModel(Bus bus) {
        return new Model(bus);
    }

    @Provides
    @Singleton
    Context provideApplicationContext() {
        return app.getApplicationContext();
    }
...

>其次我有一个活动范围组件,我提供当前活动和需要上下文的不同视图.

@ActivityScope
    @Component(
            dependencies = AppComponent.class
            , modules = {ActivityModule.class}
    )
    public interface ActivityComponent {
        void inject(MyActivity activity);
        Context context(); <---should provide the activity's context
        MyView homeView(); <----takes a Context as a contructor parameter

@Module
公共类ActivityModule {
    私人决赛活动;

public ActivityModule(Activity activity) {

    this.activity = activity;
}

@Provides
@ActivityScope
public Activity activity() {
    return activity;
}


@Provides
@ActivityScope
@Named("viewcontext") <----- if I removed this I get an error from Dagger
public Context context() {
    return activity;
}

@Provides
@ActivityScope
MyView provideZeView(Bus bus, Model model) { <---- previously receiving the ApplicationContext as a parameter 
    MyView v = new MyView(activity, bus, model); <---- must pass the activity otherwise passing the Context reveived is the ApplicationContext
    return v;
}

所以这是我的问题:
>我使用了范围,以便比传递的内容具有更好的“粒度”,我仍然得到applicationContext
>如果删除@Named qulifier,我会收到错误消息
>之前的视图由另一个模块生成,它依赖于ActivityModule但仍然获得ApplicationContext

好吧关键是我肯定错过了一些东西……但是我无法想象什么,也许我对使用Scopes感到误解

你可以使用这样的限定符.在两个单独的文件中定义以下内容:

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ActivityContext {
}

@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface ApplicationContext {
}

然后在你的ActivityModule中执行以下操作:

@Provides
@ActivityScope
@ActivityContext
public Context context() {
    return activity;
}

同样在你的appmodule中这样做:

@Provides
    @Singleton
@ApplicationContext
    Context provideApplicationContext() {
        return app.getApplicationContext();
    }

现在我们可以根据限定符@ApplicationContext和@ActivityContext来询问我们需要的任何类型的上下文.

例如,在您的活动中,您可以这样做:

@Inject @ApplicationContext
    Context c;

这将注入应用程序上下文.

在一个模块中你可以做到这一点,例如:

@Provides
    @ActivityScope
    LoginPresenter provideLoginPresenter(@ActivityContext Context context) {
        return new LoginPresenter(context);
    }

提供活动背景.这只是一个例子.

相关文章
相关标签/搜索