Dynamic feature moduleとDagger

Kenji Abe
Kenji Abe
Nov 11, 2018 · 3 min read

追記: dagger.androidを捨てたほうがシンプルなので、これは無かったことに。


ここしばらくDynamic feature moduleでDaggerをうまく使う方法を色々と試してたんですけど、それなりに納得できる感じになったのでメモを残しておきます。

正直、これ読んでもよく分からんと思います。サンプルを作って置きましたので、そこを見てもらったほうが良いかもです。

やりたかったこと

  • DaggerActivityDaggerFragment がそのまま使えること
  • DI以外の箇所で特別なことをしないこと
    (Feature moduleのActivity/Fragmentには特別な処理を書かないようにする)
  • @Module の定義はいつもどおりと同じであること(@ContributesAndroidInjector がそのまま使える)
  • Feature moduleを呼び出す側で色々やるのはしょうがないとした

環境

  • Dagger 2.19 (Android 拡張)
  • Android Studio 3.2.1

問題点

Dynamic feature moduleの大きな問題点として、依存関係が逆であるということです。
app などのメインのモジュールから各Feature moduleが参照出来ません。

基本的な考え

Application クラスに各モジュールごとのInjector追加していき、それを使ってInjectしていく感じになります。

ポイントのとこだけを軽く載せておきます。

Applicationクラス

ちょっと細かく説明するのが大変なので、まるごと貼っておきます。

ポイントとしては AndroidInjector を自前で作って、その中で各moduleのInjectorを maybeInject を使って成功するまでやってる感じです。

moduleのInjectorはリフレクションにて生成してます。

Feature moduleのComponent

Feature moduleのComponentでは、 dependencies にAppComponentを指定してあげます。

あとは、 inject メソッドを定義して、Feature moduleのInjectorをinject出来るようにします。

Feature moduleのInjector

Feature moduleのInjectorでは、injectメソッドで DispatchingAndroidInjector をInjectしてあげて、それをApplicationクラスで使用する感じになります。

FragmentのFeature moduleを使う場合

今回のサンプルでは、ApplicationクラスのほうのInjectorを使うようにしています。

必要があればApplicationクラスと同様に AndroidInjector から作る感じになります。

注意点

リフレクションで生成してる箇所があるのでProguardかけるときは気をつけてください。

まとめ

だいぶややこしいと思いますが、一度設定しておくと、ほとんど今まで通りと同じ使い方ができるようになります。

Daggerわからん。

Kenji Abe

Written by

Kenji Abe

Programmer / Gamer / Google Developers Expert for Android

More From Medium

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade