gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:13 24 4
gpt4 key购买 nike

我想使用具有 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com