带有MVP的Android Dagger 2

时间:2018-11-09 18:53:51

标签: android dagger-2 mvp

首次将Dagger 2与MVP配合使用。

我被困在一个非常简单的实现中。

我的演示者模块在构造函数中使用了View Interface以及上下文和数据管理器,我对如何将活动上下文发送到View接口的构造函数感到困惑。 任何帮助将不胜感激..

这是我的App类代码:

public class App extends Application {


    private static App app;

    public SampleComponent getSc() {
        return sc;
    }

    private SampleComponent sc;

    public static App getApp() {
        return app;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        app = this;
        sc = DaggerSampleComponent.builder()
                //.sampleModule(new SampleModule())
                .presenterModule(new PresenterModule(new MainActivity(), getApplicationContext(), new ModelManager()))
                .build();

    }
}

演示者模块代码:

@Module
public class PresenterModule {
    ShowCountContract.view v;
    ModelManager mm;
    Context c;
  public PresenterModule(MainActivity m, Context c,
                           ModelManager mm) {
        this.c = c;
        this.mm = mm;
        this.v = m;
    }

    @Singleton
    @Provides
    PresenterClass getPresentationClass() {


        return new PresenterClass(mm, v);
    }

}

1 个答案:

答案 0 :(得分:0)

要处理Android上下文,最好的方法是使用应用程序模块创建应用程序组件。该模块应负责提供整个应用程序中常见的对象,例如Context。基于该组件,您可以为每个功能/活动/等创建子组件。

@Module
public class ApplicationModule {

    private final Application application;

    public ApplicationModule(Application application) {
        this.application = application;
    }

    @Provides
    Context provideContext() {
        return application;
    }

}

如果您选择只使用一个组件(我不建议这样做),则用于DaggerComponent创建的代码将如下所示:

DaggerSampleComponent.builder()
        .applicationModule(new ApplicationModule(this))
        .otherModule(new OtherModule())
        .build();

或者您可以使用Component.Builder

由于Activity实例是由Android Framework创建的,因此我们无法将View接口作为构造函数参数传递。常见的方法是在Presenter中创建attachView(ViewInterface)这样的方法,以便能够设置内部属性。

您应该更改的另一件事是从App中删除Presenter的构造函数,并由OtherModule负责:

@Module
public class OtherModule {
    @Singleton
    @Provides
    PresenterClass getPresentationClass(Context ctx) {
        return new PresenterClass(ctx, new ModelManager());
    }
}

我建议您检查此article,深入了解Dagger,甚至显示直接考虑到Android环境的另一个Dagger版本。