概要
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チェックを無効にできました。