AndroidのHiltのCodelabsをやってみた
の続編
既存のAndroidアプリにHiltを導入してハマったところ
・DIのやり方
Applicationに、@HiltAndroidApp
Activityに、@AndroidEntryPoint
Fragmentに、@AndroidEntryPoint
するとFragmentのコード上の@Injectが動くようになる
・ViewModel
by viewModelで依存を注入できる
https://kaleidot.net/%E8%A9%B1%E9%A1%8C%E3%81%AE-dagger-hilt-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F-13acab8163e0
元のviewmodelはコンストラクタに@Injectをつける
class AAAViewModel @Inject constructor() : ViewModel()
・Singleton
@Module @InstallIn(SingletonComponent::class) object BBBModule { @Provides @Singleton fun provideAAA(): AAA = AAAImpl() }
・Retrofit
@Module @InstallIn(SingletonComponent::class) object APIModule { @Singleton @Provides fun provideRetrofit(): Retrofit = Retrofit.Builder() .baseUrl(HOST) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) .build() @Singleton @Provides fun provideRankApi(retrofit: Retrofit): Service = retrofit.create(Service::class.java) }
・エラー
・Unsupported metadata version. Check that your Kotlin version is >= 1.0
Hiltのバージョンを最新にすると解消する
2022/10/02だと2.44
https://stackoverflow.com/questions/67744002/hilt-unsupported-metadata-version-in-kotlin
・cannot be provided without an @Provides-annotated method.
DIするコードをobjectにすると解消する
provideはobject
bindsはabstract
・CreationExtras must have a value by `SAVED_STATE_REGISTRY_OWNER_KEY`
androidx.fragment:fragment-ktx
をimplementsすると解消する
ViewModelをDIしたいだけなのに、なんでfragment突っ込む必要があるんやろ
・エラー: InjectProcessingStep was unable to process ‘XXX’ because ‘YYY’ could not be resolved.
private fieldだとinjectできないだけ
・android.content.Context cannot be provided without an @Provides-annotated method.
DIするprovideメソッドにもApplicationContextを付与する
https://zenn.dev/kmd_htsh0226/articles/5ea197bc242e6e67d47a
https://github.com/google/dagger/issues/2381