2018年8月1日水曜日

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

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 を構成するときに、用意したメソッドで Application インスタンスを渡すだけです。 class MyApplication : Application() { override fun onCreate() { super.onCreate() val appComponent = DaggerAppComponent .builder() .application(this) .build() ... } } 生成されたコードでは DaggerAppComponent が application インスタンスを保持し、MembersInjector や Factory に適宜渡しています。


0 件のコメント:

コメントを投稿