Android では @Provides の引数として Application が必要だったり、@Inject で Application を渡したいことがあります。
Module のコンストラクタで Application のインスタンスを渡すようにすることで実現できますが、もっといい方法があります。
まず Component に @Component.Builder をつけた Builder インターフェースを用意します。
インタフェースの中に @BindsInstance アノテーションをつけたメソッドを用意し、Application インスタンスを渡せるようにします。
- @Component(
- modules = [
- AppModule::class
- ]
- )
- internal interface AppComponent {
-
- @Component.Builder
- interface Builder {
- fun build(): AppComponent
-
- @BindsInstance
- fun application(application: Application): Builder
- }
-
- ...
- }
@Component(
modules = [
AppModule::class
]
)
internal interface AppComponent {
@Component.Builder
interface Builder {
fun build(): AppComponent
@BindsInstance
fun application(application: Application): Builder
}
...
}
あとは Component を構成するときに、用意したメソッドで Application インスタンスを渡すだけです。
- class MyApplication : Application() {
-
- override fun onCreate() {
- super.onCreate()
-
- val appComponent = DaggerAppComponent
- .builder()
- .application(this)
- .build()
-
- ...
- }
- }
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
val appComponent = DaggerAppComponent
.builder()
.application(this)
.build()
...
}
}
生成されたコードでは DaggerAppComponent が application インスタンスを保持し、MembersInjector や Factory に適宜渡しています。
0 件のコメント:
コメントを投稿