為さねば成らぬ

retia.verno@gmail.com

dagger hiltを試す

背景

Daggerのサポートライブラリが出ていた。 以前から仕事等で使っており、依存性解決がビルド時に行われdagger起因のランタイムエラーが起こらないのが好みだったが、やはりわかりにくさが一番のネックだった。設定に追記はできるけど新しく書き直すのができない感じ。

課題

使いやすくなったとあるがどの程度使いやすくなったか、試してみる

参考

aakira.app

実装

詳しくは参考先に任せるとして、ViewModel Injectionが出来る最小の実装を示す。

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

allprojects {
    repositories {
        maven { "https://androidx.dev/snapshots/builds/6550871/artifacts/repository/" }
    }
}
apply plugin: 'dagger.hilt.android.plugin'
apply plugin: 'kotlin-kapt'

dependencies {
    implementation 'com.google.dagger:dagger:2.28'
    kapt 'com.google.dagger:dagger-compiler:2.28'
    implementation 'com.google.dagger:hilt-android:2.28-alpha'
    kapt 'com.google.dagger:hilt-android-compiler:2.28-alpha'

    implementation 'androidx.hilt:hilt-common:1.0.0-SNAPSHOT'
    implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-SNAPSHOT'
    kapt 'androidx.hilt:hilt-compiler:1.0.0-SNAPSHOT'

    
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0'
    implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.2.0'
}
@HiltAndroidApp
class ImasRadioStationApplication : Application() 
@Module
@InstallIn(ApplicationComponent::class)
class AppModule {

    @Provides
    fun provideString(): String {
        return "hogehoge"
    }
}
class MainViewModel @ViewModelInject constructor(
   val text: String,
    @Assisted private val savedState: SavedStateHandle
) : ViewModel()
@AndroidEntryPoint
class MainActivity : AppCompatActivity(R.layout.activity_main) {
     private val mainViewModel by viewModels<MainViewModel>()
 
}

雑感

  • めちゃくちゃ便利。今までよくわからなかったComponentが定義されており(ApplicationComponent等)、さらにボイラープレートもほぼannotationだけで良くなった
  • 基本dagger好きだけどKoinのようなわかりやすさにだいぶ難があったので他人に進めたりプロダクトに入れづらかったけど、このくらい楽に扱いやすいならおすすめしたいくらい
  • 早くstableほしいです