kako.dev

開発、自作アプリのこと

Dagger HiltでViewModelをDIする

今更ながらDagger Hiltを触りました。

DIの経験はDagger2とKoinを触ったことがあります。
最近はもっぱらKoinでした。

体系的に学ぶなら公式のドキュメントを読むのが最良ですが、公式ドキュメントがちょいちょい古いところがあるので、自分用にまとめます。

依存関係

プロジェクトレベルのbuild.gradleに下記を追記します。

buildscript {
    ...
    dependencies {
        classpath 'com.google.dagger:hilt-android-gradle-plugin:2.31.2-alpha'
       ...
    }
}

続いてアプリレベルのbuild.gradleに下記を追記します。

plugins {
    id 'dagger.hilt.android.plugin'
}

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    // ktx
    implementation 'androidx.core:core-ktx:1.5.0'

    // dagger hilt
    implementation 'com.google.dagger:hilt-android:2.31.2-alpha'
    kapt 'com.google.dagger:hilt-android-compiler:2.31.2-alpha'
}

アプリケーションクラスの作成

Applicationクラスを作成します。@HiltAndroidAppをつけることで依存関係が提供されます。

@HiltAndroidApp
class MainApplication: Application()

Applicationクラスを作成したらManifestファイルへの設定も忘れないようにしましょう。

<application
        ...
        android:name=".MainApplication"
        ...

ViewModelの作成

提供したいViewModelを作成して@HiltViewModelをつけます。

@HiltViewModel
class MainViewModel @Inject constructor(): ViewModel()

依存関係の注入

依存関係を注入したいクラスに@AndroidEntryPointをつけることで提供されているクラスを受け取ることができます。

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
    ...
    private val viewModel: MainViewModel by viewModels()
    ...

private val viewModel: MainViewModel by viewModels()ktxにより注入を簡略化してします。

まとめ

これだけでDIできます。

Dagger2に比べるとすごく簡単です。学習コストが大分低くなりましたね。

Koinと比べると元がDaggerなのでビルド時にエラーを吐いてくれるためアプリが起動する前に間違いに気づけます。処理スピードも多分早いんじゃないかなと。

参考

Hilt を使用した依存関係の注入  |  Android デベロッパー  |  Android Developers