2018年8月1日水曜日

Android で Dagger を使う(その4 : @BindsInstance)

Android では @Provides の引数として Application が必要だったり、@Inject で Application を渡したいことがあります。

Module のコンストラクタで Application のインスタンスを渡すようにすることで実現できますが、もっといい方法があります。

まず Component に @Component.Builder をつけた Builder インターフェースを用意します。
インタフェースの中に @BindsInstance アノテーションをつけたメソッドを用意し、Application インスタンスを渡せるようにします。
  1. @Component(  
  2.         modules = [  
  3.             AppModule::class  
  4.         ]  
  5. )  
  6. internal interface AppComponent {  
  7.   
  8.     @Component.Builder  
  9.     interface Builder {  
  10.         fun build(): AppComponent  
  11.   
  12.         @BindsInstance  
  13.         fun application(application: Application): Builder  
  14.     }  
  15.   
  16.     ...  
  17. }  
あとは Component を構成するときに、用意したメソッドで Application インスタンスを渡すだけです。
  1. class MyApplication : Application() {  
  2.   
  3.     override fun onCreate() {  
  4.         super.onCreate()  
  5.   
  6.         val appComponent = DaggerAppComponent  
  7.                 .builder()  
  8.                 .application(this)  
  9.                 .build()  
  10.   
  11.         ...  
  12.     }  
  13. }  
生成されたコードでは DaggerAppComponent が application インスタンスを保持し、MembersInjector や Factory に適宜渡しています。


0 件のコメント:

コメントを投稿