Dagger2: 2.23に入ったHasAndroidInjectorについて
Updated at Sun, Jun 2, 2019Dagger 2.23に新しく、HasAndroidInjector
インターフェースが入りました。
これは、従来のHasActivityInjector
やHasFragmentInjector
などを置き換えるために作られました。
この記事では、どのように置き換えるかを説明していきたいと思います。
また、DaggerApplication
やDaggerActivity
などの基底クラスは使っていないものとします。
置き換えていく
AppComponent
AndroidSupportInjectionModuleを使っているなら、AndroidInjectionModule
に置き換えます。
今後は、AndroidSupportInjectionModule
を使う必要はありません。
@Singleton
@dagger.Component(
modules = [
AndroidInjectionModule::class, // AndroidInjectionModuleを使う
...
]
)
interface AppComponent ...
Application
Applicationで実装している、HasActivityInjector、HasServiceInjectorなどのHasxxxInjectorをHasAndroidInjector
に置き換えます。
class App : Application(),
// HasAndroidInjectorのみでおk
HasAndroidInjector {
// 型変数がAnyになる
@Inject lateinit var androidInjector: DispatchingAndroidInjector<Any>
// 返り値の型変数がAnyになる
override fun androidInjector(): AndroidInjector<Any> {
DaggerAppComponent.factory().create(this).inject(this)
return androidInjector
}
}
今まではActivity用、Fragment用、Service用などのクラスごとにDispatchingAndroidInjector
がありましたが、それが1つのDispatchingAndroidInjector<Any>
まとまりました。
Activity, Fragment
HasSupportFragmentInjectorなどのInjectorは、HasAndroidInjector
に置き換えます。
class MainActivity : AppCompatActivity(),
// HasSupportFragmentInjectorの代わりに、HasAndroidInjectorを使う
HasAndroidInjector {
@Inject lateinit var androidInjector: DispatchingAndroidInjector<Any>
override fun onCreate(savedInstanceState: Bundle?) {
AndroidInjection.inject(this) // ここは一緒
...
}
override fun androidInjector(): AndroidInjector<Any> {
return androidInjector
}
}
---以下、Fragment---
class MainFragment : Fragment() {
override fun onAttach(context: Context) {
AndroidSupportInjection.inject(this) // ここは一緒
...
}
}
となります。従来の***Injectorが汎用的なHasAndroidInjector
まとまりました😃
大きなコードの修正は必要なさそうです。
なぜこの変更が入ったか?
ronshapiroさんが以下のツイートをしていました。
Dagger 2.23 turns off formatting by default so your build is faster, but has a flag to turn it back on if you'd like.
— Ron Shapiro (@rdshapiro) May 28, 2019
It also brings bug fixes and a more flexible https://t.co/d0MeQYkvAV API that will allow for more androidx supporthttps://t.co/vtW7gebmu2
今後、androidxのサポートを柔軟に対応するために必要だった変更のようです。
DaggerApplicationや、DaggerAppCompatActivity、DaggerSupportFragmentなどを使っている場合
2.23では、これらの基底クラスでHasAndroidInjector
を使っているので特に対応は必要ありません。
// HasAndroidInjectorを使う実装に置き換わっている
@Beta
public abstract class DaggerApplication extends Application implements HasAndroidInjector {
...
}
唯一、AppComponentではAndroidSupportInjectionModule
を使っていると思うのでそこの置き換えは必要です。
まとめ
- HasAndroidInjectorという1つの汎用インターフェースが爆誕した
- androidxのサポート増やしてくれそう。嬉しい😃
- (ViewModel対応してほしい…)