ダガー2は、注入された対象にActivity、thisポインタを入れたいです.
2644 ワード
多くなくて、先に基本教程を書いて、私は見ていてマスターしました.ぜひ理解してください.そうしないと下のは見られません.
http://www.open-open.com/lib/view/open1474442495481.html
読み終わったら、注入されたオブジェクトのコンストラクタを少し修正します.例えば、MVPのPresentでActivityへの参照を常に確立します.
思索が解けませんでした.ソースを探しています.
MainActivityでは、私たちはこのように呼びます.ダガーMainctivityComponent.creat().inject(this)
私達はとても好奇心があります.createはどのように構成されていますか?内部に入ります.
ソースコードの生成を確認します.
Dagger MainActivityComponentにBuiderビルダーがあります.これを見に来ました.
私達はクリアーの過程を注意して、彼は現在のmanActivityが空かどうかを判断します.もし暇なら、私達はもう一つ作成します.問題はここにあります.無駄話です.最初の作成はもちろん暇です.
この時、私達は初一からメーンActivityの方法があります.ハハ、私達にメーンActivityの値を設定してくれます.だから、私たちはまずcreateを呼び出さないでください.そうすれば、MainActivityの中将になります.
実際にテストして、私たちは正しいです.
注入コードを見に来ました.
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のカスタム注入が完了します.