当前位置:  开发笔记 > Android > 正文

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

如何解决《AndroidDagger2和MVP注入一个注入的对象》经验,为你挑选了1个好方法。

我想用Dagger 2和MVP模式.所以我有这个场景,每个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在我的演示者中注入.我不想像我所做的那样在我的演示者中注入一个组件MyFragment.

这种方法有什么办法吗?



1> EpicPandaFor..:

考虑必须通过组件手动调用字段注入,您需要对组件的引用.当然,您不应该在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() {
    }
 }

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有