android - 尝试使用 Dagger 2 实现 MVP - 如何在提供的演示者中获取对 Activity 的引用

标签 android dependency-injection mvp dagger-2

我正在尝试使用 MVP 和 Dagger 设置一个应用,

view 是一个实现 View 界面的Activity

public class OverviewActivity extends AppCompatActivity implements OverviewContract.View {

    @Inject OverviewPresenter presenter;

    @BindView(R.id.history_days) ListView HistoryLabels;
    @BindView(R.id.history_events) ListView HistoryEvents;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overview);
        ButterKnife.bind(this);

        DaggerOverviewComponent.create().inject(this);

    }

    @Override
    public void showHistory(List<Exercise> history) {
      // ...
    }

    @Override
    public void updateScoreSlider(float value) {
      // ...
    }

    @OnClick(R.id.add_event_button)
    public void addEvent(View v){
      // ...
    }
}

presenter 看起来像这样

public class OverviewPresenter implements OverviewContract.Events {

    OverviewContract.View view;

    public OverviewPresenter( OverviewContract.View overviewView ) {
        view = overviewView;

    }

    @Override
    public void loadHistory() {
        // TODO
    }

    @Override
    public void addNewEvent() {
        // TODO
    }
}

我遇到麻烦的地方是演示者的 providerOverviewPresenter 的依赖项之一是 OverviewActivity,但是我应该如何将 OverviewActivity 的实例注入(inject)到 OverviewPresenter ?

@Module
public class PresenterModule {

    @Provides
    static OverviewPresenter provideOverviewPresenter(){
        return new OverviewPresenter(/* pass in the instance of the activity here?? */);
    }
}

我的组件看起来像

@Component(modules = {PresenterModule.class})
public interface OverviewComponent {

    void inject(OverviewActivity overviewActivity);
}

请原谅我,如果这太离谱了,我仍在尝试将我的头缠绕在 Dagger 上。

总而言之:
我如何设置它以便我的 OverviewActivity 可以注入(inject) OverviewPresenter,而 OverviewPresenter 本身也注入(inject)了 OverviewActivity 的实例?

最佳答案

  • 要提供 dagger 无法自行创建的东西,您需要使用模块。
  • 要提供演示者,您只需使用 @Inject 注释构造函数即可,您不需要使用模块——也不应该。

由于你的 View 实现了 View ,你不能自己创建 View ,dagger 也不能。因此创建一个模块来提供 View

@Module
public class OverviewModule {

    OverviewView mView;

    OverviewModule(OverviewView view) {
        mView = view;
    }

    @Provides
    static OverviewView provideOverviewView() {
        return mView;
    }
}

然后调整您的演示者以使用构造函数注入(inject)

public class OverviewPresenter implements OverviewContract.Events {

    OverviewContract.View view;

    @Inject
    public OverviewPresenter( OverviewContract.View overviewView ) {
        view = overviewView;
    }
}

然后只需将模块添加到您的组件即可。

@Component(modules = {OverviewModule.class})
public interface OverviewComponent {

    void inject(OverviewActivity overviewActivity);
}

现在只需注入(inject)您的演示者即可完成(像这样,可能有错字):

DaggerOverviewComponent.builder().overviewModule(new OverviewModule(this)).build()
        .inject(this);

关于android - 尝试使用 Dagger 2 实现 MVP - 如何在提供的演示者中获取对 Activity 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105372/

相关文章:

c# - Azure Function(使用 DI)无法删除 "/api"路由前缀

ios - 将模型对象的引用存储在其中表示的 UITableViewCell 中是否正确?

android - ionic 错误 : In <declare-styleable> FontFamilyFont, 无法找到属性 android:fontVariationSettings

java - 在对话框 Activity 中自动显示软键盘

android - 如何使用 Hilt 在存储库中注入(inject)应用程序上下文?

c# - 窗口依赖注入(inject)

android - 为 Android 应用定义 MVP 模式的问题

android - Presenter/View/ViewState 关系

android - 这花费了意想不到的长时间

java - 当我关闭我的应用程序时,为什么我的 Android 应用程序 Activitie 会重新打开