Всякий раз, когда я использую аннотацию @Named в своем коде, я всегда получаю «java.lang.String не может быть предоставлен без конструктора @Inject или метода с аннотацией @Provides». эта ошибка Пожалуйста, найдите фрагменты кода ниже, но перед проверкой кода позвольте мне разъяснить вам, чего я хочу достичь, и с какой именно проблемой я столкнулся. Итак, я пытаюсь сохранить две функции в моем файле модуля, которые возвращают тот же тип, что и String, для этого я пытаюсь использовать аннотацию @Named, и после этого я получаю вышеупомянутую ошибку, и если я сохраняю только одну функцию для типа String, тогда мой проект работает без ошибок.

Это мой класс компонентов

@Singleton
@Component(modules = [GeneralModules::class])
interface MainComponent {

    fun dummyString():String
}

Это мой класс модуля

@Module
class GeneralModules {

     @Provides
    @Singleton
    @Named("name1")
    fun getDummyString1(): String{
        return "some name"
    }

   @Provides
   @Singleton
   @Named("name2")
   fun getDummyString(): String{
       return "some name"
   }

}

Вот как я использую внутри класса Activity

@Inject
@field:Named("name1")
lateinit var name1: String

@Inject
@field:Named("name2")
lateinit var name2: String

Поэтому, если я удалю @Named из файла модуля, удалю одну функцию и удалю код @field:Named из активности, он будет работать без ошибок.

0
anoop ghildiyal 5 Апр 2020 в 16:37

1 ответ

Вы можете использовать annotation class с @Qualifier из javax.inject.Qualifier.

Файл квалификатора

@Qualifier
annotation class Name1

@Qualifier
annotation class Name2

Класс модуля

@Module
class GeneralModules {

    @Provides
    @Singleton
    @Name1
    fun getDummyString1(): String{
        return "some name"
    }

    @Provides
    @Singleton
    @Name2
    fun getDummyString(): String{
        return "some name"
    }
}

Код внутри класса Activity

@Inject
@Name1
lateinit var name1: String

@Inject
@Name2
lateinit var name2: String
2
Harsh 5 Апр 2020 в 16:56