概要
Dagger Hiltでは「Hilt Component」という形で予め用意されたComponentを使用することでComponentの構造に悩むことが無くなり、AndroidでのDI(Dependency Injection)をよりシンプルに利用可能です。
Hiltでは、@InstallIn
アノテーションでModuleをどのHiltコンポーネントにインストールするかを指定します。これにより、どのコンポーネント階層以下でBindingを利用できるかを制御できます。そのため、@InstallIn
アノテーションを付け忘れると正常にBindingが提供されずエラーになります。
Dagger Hiltの@InstallIn
チェック
Hiltは、デバッグを容易にするために、Moduleに@InstallIn
アノテーションをつけ忘れた場合エラーを発生させビルドを失敗させます。
例として次のようなModuleを想定します。
@Module
@InstallIn(SingletonComponent::class)
object FooModule {
@Singleton
@Provides
fun provideFoo(): Foo = Foo()
}
class Foo {
fun say() = "Hello"
}
ここで意図的に@InstallIn
をコメントアウトすると次のようなエラーが発生し、ビルドが失敗します。
エラー: [Hilt]
public final class FooModule {
^
com.hore1024.daggerhiltsample.FooModule is missing an @InstallIn annotation.
このDagger Hiltのチェック機能は非常に有用で、@InstallIn
アノテーションの付け忘れを防ぐことができます。
@InstallIn
チェックを無効にする
@InstallIn
チェックは有用ですが、そのチェックを無効にしたい場面もあります。例えば、Hilt Moduleと通常のDagger Moduleを共存させたい場合です。
@InstallIn
チェックの無効化は、次の二つの方法で可能です。
Compile Optionsを指定する
Annotation Processorのオプションとして-Adagger.hilt.disableModulesHaveInstallInCheck=true
を渡します。build.gradleで次のように指定することが可能です。
android {
...
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments += ["dagger.hilt.disableModulesHaveInstallInCheck" : "true"]
}
}
}
}
@DisableInstallInCheck
アノテーションを使用する
チェックを無効にしたいModuleに@DisableInstallInCheck
アノテーションを追加します。
@DisableInstallInCheck
@Module
object FooModule {
@Singleton
@Provides
fun provideFoo(): Foo = Foo()
}
class Foo {
fun say() = "Hello"
}
これで@InstallIn
チェックを無効にできました。