概要
ApplicationのContextをインジェクトしたい場合、Moduleのコンストラクタの引数にとるか、Component.Builderを定義していましたが、Dagger2.22から @Component.Builder
AndroidInjector.Builder
がdeprecatedになったので対応メモ。
@Component.Factory
@Component.Builder
に加えて@Component.Factory
が追加されました。
今までは
@Component(...)
interface ApplicationComponent {
@Component.Builder
interface Builder {
@BindsInstance
fun context(context: Context): Builder
fun build(): ApplicationComponent
}
}
あるいはdagger-androidを使っている場合は
@Component(...)
interface ApplicationComponent : AndroidInjector<MyApp> {
@Component.Builder
abstract class Builder : AndroidInjector.Builder<MyApp>
}
の様に書いていました。
@Component.Factory
を使った場合はcreate
メソッドを一つだけ定義するようにします。
そのため、@BindsInstance
アノテーションがメソッドの引数に指定できるようになりました。
@Component(...)
interface ApplicationComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context): ApplicationComponent
}
}
dagger-androidを使う場合は
@Component(...)
interface ApplicationComponent : AndroidInjector<MyApp> {
@Component.Factory
interface Factory : AndroidInjector.Factory<MyApp>
}
のようになります。
他にもBindsInstanceしたいものがあった場合などにはcreateの引数に取れば良さそう。
なので、Builderと比べて、オブジェクトの渡し忘れがコンパイルで検知されるので、ミスが減りそうです。
以上!