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

2017-03-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的自定义的注入。

上一篇下一篇

猜你喜欢

热点阅读