Использование Hilt @IntallIn для модуля dagger-2, который имеет статический метод

#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) 
 }

}