美文网首页
Dagger2 想给被注入的对象传入Activity,this指

Dagger2 想给被注入的对象传入Activity,this指

作者: 浮云骑士_ | 来源:发表于2017-03-14 12:14 被阅读0次

    不多说,先帖基本教程,我就是看着学会的。一定要理解,否则下面的看不下去。

    http://www.open-open.com/lib/view/open1474442495481.html

    看完后,我们稍作修改,改变被注入的对象的构造器
    比如这样,因为我们会常在MVP的Present中建立对Activity的引用

    public class Pot {
        @Inject
        public Rose rose;
        public MainActivity activity ;
        @Inject
        public Pot(MainActivity mainActivity){
            activity = mainActivity;
        }
    
        public String show() {
            return rose.whisper();
        }
    }
    

    这个时候我们就会想,MainActivity怎么传入进来? 我们知道注入的时候来源只有两种,一种是构造函数,第二种是Model,对于第一种,我们显然不可能将MainActivity的构造函数用来注射,因为这样我们得到的MainActivity和我们当前的实例肯定不一样,所以我们用第二种。我们将MainActivity设置为Model,并写一个方法:

    @Provides
        public MainActivity getActivity(){
            return this ;
        }
    

    这样在Component获取类的实例,我们可以将当前MainActivity的实例传入进去,但是运行后我们发现,还是不一样,原因是Model仍然会再初始化一次,然后调用getActivity()方法。

    思索无解,我们找源码
    我们注意到:

    在MainActivity中我们是这么调用的
    DaggerMainActivityComponent.create().inject(this);

    我们很好奇,create是怎么构造的,我们进入内部

    我们来看看生成的代码的源码。

    在DaggerMainActivityComponent 中有一个Builder构建器。我们来看这个。

    public static final class Builder {
        private MainActivity mainActivity;
    
        private RoseModel roseModel;
    
        private Builder() {}
    
        public MainActivityComponent build() {
          if (mainActivity == null) {
            this.mainActivity = new MainActivity();
          }
          if (roseModel == null) {
            this.roseModel = new RoseModel();
          }
          return new DaggerMainActivityComponent(this);
        }
    
        public Builder roseModel(RoseModel roseModel) {
          this.roseModel = Preconditions.checkNotNull(roseModel);
          return this;
        }
    
        public Builder mainActivity(MainActivity mainActivity) {
          this.mainActivity = Preconditions.checkNotNull(mainActivity);
          return this;
        }
      }
    

    这里有两个Model,我们只看MainActivity

    我们注意到create()的过程,他会判断当前mainActivity是否为空, 如果为空,我们重新创建一个,问题就出在这,废话,初始创建当然为空。

    这个时候我们初一到有一个mainActivity的方法,哈哈,可以给我们设置mainActivity的值。所以我们先不调用create(),我们这么来,在MainActivity中

    DaggerMainActivityComponent.create().inject(this);
    

    改为

    DaggerMainActivityComponent.builder().mainActivity(this).build().inject(this);
    

    这样我们就可以传入自己的Model实例。

    事实上测试,我们正确了,😄。

    来看看注入的代码。

    private void initialize(final Builder builder) {
    
        this.getActivityProvider = MainActivity_GetActivityFactory.create(builder.mainActivity);
    
       ...
      }
    

    看到没,我们设置了Model的实例,之后的Provider类(抽象工厂)是基于我们的自定义的Model来设置的,这样就完成对MainActivity的自定义的注入。

    相关文章

      网友评论

          本文标题:Dagger2 想给被注入的对象传入Activity,this指

          本文链接:https://www.haomeiwen.com/subject/wcncnttx.html