Hilt は Android 用の依存関係インジェクション ライブラリです。これを使うことで、プロジェクトで依存関係の注入(DI)を手動で行うためのボイラープレートが減ります。Daggerが非常にわかりやすくなっていたので、これからHiltを使ってみましょう。
ライブラリの導入###
まず、hilt-android-gradle-plugin プラグインをプロジェクトのルート build.gradle ファイルに追加します。
buildscript {
...
dependencies {
...
classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha'
}
}
次に、Gradle プラグインを適用し、app/build.gradle ファイルに次の依存関係を追加します。
...
apply plugin: 'kotlin-kapt'
apply plugin: 'dagger.hilt.android.plugin'
android {
...
}
dependencies {
implementation "com.google.dagger:hilt-android:2.28-alpha"
kapt "com.google.dagger:hilt-android-compiler:2.28-alpha"
}
Hilt は Java 8 の機能を使用しています。プロジェクトで Java 8 を有効にするには、app/build.gradle ファイルに次の内容を追加します。
kotlinのプロジェクトの場合はkotlinOptionsの配置を追加する必要です
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "1.8"
}
}
Hiltの一般的なインジェクションの意味
@HiltAndroidApp
- Hilt を使用するアプリには、@HiltAndroidApp アノテーションが付けられた Application クラスが含まれている必要があります。
- @HiltAndroidApp は、Hilt のコード生成をトリガーします。これには、アプリケーション レベルの依存関係コンテナとして機能するアプリケーションの基本クラスも含まれます。
- ここで生成された Hilt コンポーネントは、Application オブジェクトのライフサイクルにアタッチされ、依存関係を提供します。また、アプリの親コンポーネントであることから、他のコンポーネントがこのコンポーネントの提供する依存関係にアクセスできます。
- Hilt はApplication、Activity、Fragment、View、Service、BroadcastReceiverの Android クラスをサポートしています
@HiltAndroidApp
class App : Application() {
}
@AndroidEntryPoint
- Activity:FragmentActivity、AppCompatActivityなどのComponentActivity を拡張するアクティビティのみをサポートします
- Fragment:androidx.Fragment を拡張するフラグメントのみをサポートします。
- View
- Service
- BroadcastReceiver
- Androidクラスに@AndroidEntryPointの注釈が付けられている場合は、依存するAndroidクラスに同じ注釈を追加する必要があります
@AndroidEntryPoint
class MainActivity:AppCompatActivity()
@Inject
- クラスのコンストラクタで @Inject アノテーションを使用して、そのクラスのインスタンス提供方法を Hilt に知らせます。コンストラクター、非プライベートフィールド、メソッドでよく使用されます
class AnalyticsAdapter @Inject constructor(
private val service: AnalyticsService
) {
@Inject
lateinit var user:User
}
@Module
@Moduleでアノテーションが付けられたクラスの場合、@ InstallInを使用してモジュールのスコープを指定する必要があります。多くの場合、依存クラスのオブジェクト(サードパーティライブラリOkHttp、Retrofitなど)を作成するために使用されます。
@Module
@InstallIn(ApplicationComponent::class)
// ApplicationComponentが使用されるため、NetworkModuleはApplicationのライフサイクルにバインドされます。
object NetworkModule {
}
@Provides
クラスの内部メソッドを@Moduleアノテーションでマークし、依存関係オブジェクトを提供するためによく使用されます。
@Module
@InstallIn(ApplicationComponent::class)
object NetworkModule {
/**
* @Provides
* @Singleton
*/
@Provides
@Singleton
fun provideOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.build()
}
}
具体的なソースを説明ソースに置きました。是非試してみてください。