LoginSignup
3
1

More than 3 years have passed since last update.

AndroidのHiltをkotlinで実装する

Last updated at Posted at 2021-01-11

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

  1. Hilt を使用するアプリには、@HiltAndroidApp アノテーションが付けられた Application クラスが含まれている必要があります。
  2. @HiltAndroidApp は、Hilt のコード生成をトリガーします。これには、アプリケーション レベルの依存関係コンテナとして機能するアプリケーションの基本クラスも含まれます。
  3. ここで生成された Hilt コンポーネントは、Application オブジェクトのライフサイクルにアタッチされ、依存関係を提供します。また、アプリの親コンポーネントであることから、他のコンポーネントがこのコンポーネントの提供する依存関係にアクセスできます。
  4. Hilt はApplication、Activity、Fragment、View、Service、BroadcastReceiverの Android クラスをサポートしています
@HiltAndroidApp
class App : Application() {
}

@AndroidEntryPoint

  1. Activity:FragmentActivity、AppCompatActivityなどのComponentActivity を拡張するアクティビティのみをサポートします
  2. Fragment:androidx.Fragment を拡張するフラグメントのみをサポートします。
  3. View
  4. Service
  5. BroadcastReceiver
  6. 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()
    }
}

具体的なソースを説明ソースに置きました。是非試してみてください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1