Android Dagger 2和MVP注入一个注入的对象

时间:2015-12-13 11:43:02

标签: android mvp dagger-2

我想使用具有MVP模式的Dagger 2。我有这种情况,每个ng-options="productSize as ( productSize | sizeWithPrice: product ) for productSize in productSizes track by productSize.id" 都有自己的View,例如Component有一个像这样的组件:

MyFragment

@PerFragment @Component(dependencies = ActivityComponent.class, modules = MyFragmentModule.class) public interface MyFragmentComponent { void inject(MyFragment fragment); } 中,我提供了一个演示者和一个将在MyFragmentModule中使用的模型

MyFragment

现在我在@Module public class MyFragmentModule { @Provides @PerFragment public MyPresenter providePresenter() { return new MyPresenter(); } @Provides @PerFragment public Model provideModel() { return new Model(); } } 注入组件:

MyFragment

同样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; } 。我不想像我在Model中所做的那样在我的演示者中注入一个组件。

这种方法有什么办法吗?

1 个答案:

答案 0 :(得分:5)

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

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

@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);
    }
}

你的另一种选择是构造函数注入。

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() {
    }
 }