当前位置: 首页 > 知识库问答 >
问题:

尝试使用Dagger 2实现MVP-如何在提供的演示器中获得对活动的引用

锺离正祥
2023-03-14

视图是实现视图接口的活动

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){
      // ...
    }
}

演示者看起来像这样

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
    }
}

我遇到麻烦的地方是演示者的提供者。OverviewPresenter的依赖项之一是OverviewActivity,但是如何将OverviewActivity的实例插入到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);
}

TLDR:
我如何设置它,以便我的OverviewActivity可以被注入到OverviewPresenter中,而OverviewPresenter本身也被注入到OverviewActivity的实例中?

共有1个答案

谷梁承宣
2023-03-14
  • 要提供dagger自己无法创建的东西,需要使用模块。
  • 提供演示器,您只需用@inject注释构造函数即可,您不需要使用模块,也不应该使用模块。

因为您的视图实现了视图,所以您不能自己创建视图,Dagger也不能。因此创建一个模块来提供视图

@Module
public class OverviewModule {

    OverviewView mView;

    OverviewModule(OverviewView view) {
        mView = view;
    }

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

然后调整您的演示器以使用构造函数注入

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);
}
DaggerOverviewComponent.builder().overviewModule(new OverviewModule(this)).build()
        .inject(this);
 类似资料:
  • 我创建了提供应用程序上下文的模块,我希望在模型层获得上下文。 我在Presenter层注入上下文,它使用,但是当我移到模型层时,Dagger在变量上注入一个值。 注入 主模块

  • 我试图创建GIF动画演示我的应用程序。 为了创建我的应用程序的动画GIF,我需要获取屏幕截图。我知道我可以调用Form.paint(图形)-方法。但是,在拖放时,这不会正确地给我一个屏幕截图。在Codename One中获取屏幕截图的最佳方式是什么?

  • 问题内容: 我目前正在屏幕上显示。警报的视图应仅在警报中心显示2个元素,一个标题和一个。下面是显示警报及其元素的功能。 但是,活动指示器不会显示在视图中心,实际上它显示在屏幕的右下角,离视图很远。这是什么原因呢? 编辑:我知道我可以为指标的位置硬编码数字,但是我希望警报在具有多种屏幕尺寸和方向的多种设备上运行。 问题答案: 创建视图时,请务必设置frame属性。 到@ 62Shark:

  • 问题内容: 本文指出:“ defer语句将函数调用推送到列表上。” 我想知道是否可以从程序的另一个位置访问该列表中的元素,然后调用它们?我可以多次调用它们吗?我假设我对具有延迟行为(如果有帮助)的函数进行了引用。 因此,这是我想做的简短示例: 问题答案: 调用存储的“列表” 完全是特定于实现的,因此您 没有可靠的方式访问此列表 。1,2个为* G编译器家族中的实现细节(虽然有点老),可以发现在拉斯

  • 问题内容: 如何在Swift中获得对应用程序委托的引用? 最终,我想使用引用来访问托管对象上下文。 问题答案: 另一种解决方案是正确的,因为它将为您提供对应用程序委托的引用,但这将不允许您访问UIApplication的子类添加的任何方法或变量,例如托管对象上下文。要解决此问题,只需向下转换为“ AppDelegate”或您的UIApplication子类碰巧被调用的任何东西。在 Swift 3、

  • 问题内容: 指针是仅用于实现Java参考变量还是实际上如何实现?以下是Java语言规范中的代码行 4.3.1对象对象是类实例或数组。引用值(通常只是引用)是指向这些对象的指针,还有一个特殊的空引用,它不引用任何对象。 这是否意味着一直都是指针? 问题答案: 在现代JVM中,引用被实现为地址。 回到HotSpot的第一个版本(对于“经典VM”来说更早一些),引用被实现为句柄。那是指向指针的固定指针。