我想使用具有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
中所做的那样在我的演示者中注入一个组件。
这种方法有什么办法吗?
答案 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() {
}
}