#android #kotlin #dagger-2 #dagger-hilt
#Android #kotlin #dagger-2 #dagger-рукоять
Вопрос:
При выполнении миграции dagger-2 на hilt возникла эта ошибка для модуля
Ошибка:
FooModule.Companion is listed as a module, but it is a companion
object class.
Add @Module to the enclosing class
and reference that instead.
Перед эфесом
@Module
abstract class FooModule {
@Binds
@FooScope
abstract fun bindsManager(impl: FooManagerImpl): FooManager
@Module
companion object {
@Provides
@FooScope
@JvmStatic
fun providesConfig(prefs: SharedPreferences): FooConfig = FooConfigImpl(prefs)
}
}
После эфеса
@InstallIn(ApplicationComponent::class)
@Module
abstract class FooModule {
@Binds
@FooScope
abstract fun bindsManager(impl: FooManagerImpl): FooManager
@InstallIn(ApplicationComponent::class)
@Module
companion object {
@Provides
@FooScope
@JvmStatic
fun providesConfig(prefs: SharedPreferences): FooConfig = FooConfigImpl(prefs)
}
}
Ссылка на документ о миграции: https://developer.android.com/codelabs/android-dagger-to-hilt#4
Комментарии:
1. Узнал о комментарии Джейка Уортона об использовании
objects
вместо github.com/google/dagger/issues/900#issuecomment-410041915
Ответ №1:
Dagger 2.26 допустил ошибку при включении сопутствующего объектного модуля в modules
параметр @Component
or @Subcomponent
. Вместо этого сопутствующие объекты включаются автоматически, если содержащий класс является модулем. Hilt @InstallIn
просто добавляет аннотированный модуль в сгенерированный класс компонентов, поэтому вы получаете ту же ошибку, если вы аннотируете сопутствующий объект @InstallIn
.
Удалите @InstallIn
(и @Module
) из сопутствующего объекта, и все должно работать нормально.
Ответ №2:
Вам нужно изменить companion object
на object
@InstallIn(ApplicationComponent::class)
@Module
abstract class FooModule {
@Binds
@FooScope
abstract fun bindsManager(impl: FooManagerImpl): FooManager
@InstallIn(ApplicationComponent::class)
@Module
object AppModule{
@Provides
@FooScope
fun providesConfig(prefs: SharedPreferences): FooConfig = FooConfigImpl(prefs)
}
}