Android Dagger 2 和 MVP 在注入(inject)的对象中注入(inject)

标签 android mvp dagger-2

我想使用具有 MVP 模式的 Dagger 2。所以我有这种情况,每个 View 都有自己的 Component 例如MyFragment 有一个这样的组件:

@PerFragment @Component(dependencies = ActivityComponent.class, modules = MyFragmentModule.class)
public interface MyFragmentComponent {
  void inject(MyFragment fragment);
}

MyFragmentModule 中,我提供了一个 Presenter 和一个将在 MyFragment 中使用的模型

@Module public class MyFragmentModule {

  @Provides @PerFragment public MyPresenter providePresenter() {
    return new MyPresenter();
  }

  @Provides @PerFragment public Model provideModel() {
    return new Model();
  }
}

现在我在 MyFragment 中注入(inject)组件:

public class MyFragment extends Fragment{
       @Inject MyPresenter presenter;

@Override public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    component = DaggerMyFragmentComponent.builder()...build();
    component.inject(this);
  }
}

MyPresenter 也是这样的:

   public class MyPresenter {

      @Inject Model model;
}

问题

我不知道如何在我的演示者中注入(inject) Model。我不想像在 MyFragment 中那样在我的 Presenter 中注入(inject)组件。

这种做法有什么办法吗?

最佳答案

考虑到必须通过组件手动调用字段注入(inject),您需要对组件的引用。当然,您不应该在 Presenter 中合法地创建新组件,我认为您应该做的是提供包含组件引用的类。

请检查 EDIT 以获得正确的解决方案。

@Module
public class MyFragmentModule {
    private MyFragment myFragment;

    public MyFragmentModule(MyFragment myFragment) {
        this.myFragment = myFragment;
    }

    @Provides
    public MyFragment myFragment() {
        return myFragment;
    }

    @Provides @PerFragment public MyPresenter providePresenter(MyFragment myFragment) {
        return new MyPresenter(myFragment);
    }

    @Provides @PerFragment public Model provideModel(MyFragment myFragment) {
        return new Model(myFragment);
    }        
}

public class MyPresenter {
    @Inject Model model;

    public MyPresenter(MyFragment myFragment) {
        myFragment.getComponent().inject(this);
    }
}

您的另一个选择是构造函数注入(inject)。

public class MyPresenter {
    private Model model;

    public MyPresenter(Model model) {
        this.model = model;
    }
}

    @Provides @PerFragment public MyPresenter providePresenter(Model model) {
        return new MyPresenter(model);
    }

编辑:第三种解决方案是完全跳过 Presenter 模块,只使用 @Inject 带注释的构造函数。

@PerFragment
public class MyPresenter {
    private Model model;

    @Inject
    public MyPresenter(Model model) {
        this.model = model;
    }
 }

或者

@PerFragment
public class MyPresenter {
    @Inject
    Model model;

    @Inject
    public MyPresenter() {
    }
 }

关于Android Dagger 2 和 MVP 在注入(inject)的对象中注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34250706/

相关文章:

android - 禁用 Chrome 调试。 Cordova 5.0.0

android - 在 Dagger/MVP 应用程序中放置业务逻辑的位置

java - 将 View 的 JButtons 对象暴露给 Presenter 的简洁方法

android - 在 flutter 中使用 MVP 架构的 Chopper

android - 如果没有 @Provides-annotated 方法,则无法提供 Dagger/MissingBinding Repository

java - 随机实例化派生类

android - Realm 空对象引用

android - 在 ViewPager 中预加载下一个(或上一个)页面

android - Dagger 2 Kotlin 和 Room 出现错误

android - Dagger 2 androidx fragment 不兼容类型