ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-06-09 02:11:22  阅读:166  来源: 互联网

标签:android mvp dagger-2


我想用Dagger 2和MVP模式.所以我有这种情况,每个View都有自己的组件,例如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;
}

我不知道如何在演示者中注入模型.我不想像我在MyFragment中所做的那样在我的演示者中注入一个组件.

这种方法有什么办法吗?

解决方法:

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

标签:android,mvp,dagger-2
来源: https://codeday.me/bug/20190609/1202157.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有