Skip to main content

AndroidアプリにHiltを導入してハマったところ

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

 

関連記事:

Pocket