ダガー2は、注入された対象にActivity、thisポインタを入れたいです.

2644 ワード

多くなくて、先に基本教程を書いて、私は見ていてマスターしました.ぜひ理解してください.そうしないと下のは見られません.
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では、私たちはこのように呼びます.ダガーMainctivityComponent.creat().inject(this)
私達はとても好奇心があります.createはどのように構成されていますか?内部に入ります.
ソースコードの生成を確認します.
Dagger MainActivityComponentにBuiderビルダーがあります.これを見に来ました.
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しか見ません.
私達はクリアーの過程を注意して、彼は現在のmanActivityが空かどうかを判断します.もし暇なら、私達はもう一つ作成します.問題はここにあります.無駄話です.最初の作成はもちろん暇です.
この時、私達は初一からメーンActivityの方法があります.ハハ、私達にメーンActivityの値を設定してくれます.だから、私たちはまず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のカスタム注入が完了します.