Android Dagger 2和MVP在注入对象内部进行注入

4

我希望使用Dagger 2来实现MVP模式。因此我有这个场景,每个View都有自己的Component,例如MyFragment有一个如下的组件:

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

MyFragmentModule中,我提供了一个Presenter和一个Model,它们将被用于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;
}

问题

我不知道如何在我的Presenter中注入Model。我不想像在MyFragment中那样注入一个组件。

有没有其他方法可以实现这种方式?

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接