Dagger2による新しいAndroidインジェクタ – パート3

パート1およびパート2を読んでいない場合は、最初にそれらを読むことをお勧めします。

TLDR;

DaggerActivity, DaggerFragment, DaggerApplication を使用すると、アクティビティ/フラグメント/アプリケーションの定型文を削減することができます。

また、AndroidInjector<T> を dagger コンポーネントで使用して、定型文を減らすこともできます。

dagger を使用したいすべてのアクティビティまたはフラグメントで AndroidInjection.inject() を呼び出したことを覚えておいてください。 また、フラグメントで Injection を使用する場合、アクティビティで HasSupportFragmentInject インターフェイスを実装し、フラグメント インジェクターをオーバーライドする必要があります。 なぜ、1 つ 1 つのアクティビティでそれを宣言する必要があるのでしょうか。

その後、調査中に dagger プロジェクトで DaggerAppCompatActivity と DaggerFragment といういくつかのクラスを見ました。 これらのクラスは、私が行ったこととまったく同じことを行います。 Androidは継承が大好きです。 そのため、私たちもそれを愛しているように装うことができます。

DaggerAppCompatActivity

これらのライブラリ クラス内で何が起こっているのか見てみましょう。 DaggerAppCompatActivity からアクティビティを拡張することにより、アクティビティ内の定型コードを削減できます。

私たちの DetailActivity クラスは次のようでした。

DaggerAppCompatActivity からこれを拡張して、アクティビティから HasSupportFragmentInjector とオーバーライド メソッドを削除しましょう。

Now, It is better.

DaggerApplication, AndroidInjector, AndroidSupportInjectionModule

boilerplate code を減らすために他にできることを見ていきましょう。 AndroidInjectorは、アプリコンポーネントを簡素化するのに役立ちます。

アプリコンポーネントとアプリケーションクラスを見てみましょう。

build() と seedInstance() はすでに AndroidInjector.Builder クラスで定義されています。

また、AndroidInjector インターフェースには、inject() メソッドがあります。 そこで、inject() メソッドを削除して、AndroidInjector<Application>

から AppComponent インターフェースを拡張することができますので、更新してボイラープレートを削減すると、次のようになります

モジュールも変更していることに気づきましたか? コンポーネント モジュールの AndroidInjectionModule.class を削除して、AndroidSupportInjectionModule.class を追加しました。 これは、サポートフラグメントを使用するために追加したものです。 AndroidInjectionModuleは、app.Fragmentとdaggerをバインドします。

AppComponent へのインジェクションの方法を変更しました。

DaggerActivityとDaggerFragmentと同様に、DaggerApplicationからApplicationクラスを拡張する必要があります。

私たちの Application クラスは次のようなものでした。

私たちはそれを…

Source

この簡略化した実装を github ページのブランチで見ることができます。 私はすべてのブランチでdaggerの古い使い方を示したいので、それをmasterにマージしていないのです。 そのため、読者は旧来の方法から簡略化された方法への道を辿ることができます。

PS.

Leave a Reply