Инъекционное дооснащение с использованием рукояти

Я новичок в Hilt и никогда не пользовался кинжалом должным образом. Я получаю следующую ошибку.

[Dagger/MissingBinding] retrofit2.Retrofit cannot be provided without an @Inject constructor or an 
@Provides-annotated method.

Я аннотировал свой метод provideRetrofit с помощью @provides и установил его в Application Component. Я хочу внедрить его в свою основную деятельность и использовал там аннотацию инъекции. Я попытался установить его в компонент активности, но результат тот же.

Вот мой модуль модернизации.

@Module
@InstallIn(ApplicationComponent::class)
class RetrofitModule {

@Singleton
@Provides
fun provideGson(): Gson {
    return GsonBuilder().create()
}

@Singleton
@Provides
fun provideRetrofit (gson: Gson): Retrofit{
   return Retrofit.Builder().baseUrl("Base Url")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create()).build()
}
}

В своей основной деятельности я написал это, чтобы ввести его.

@AndroidEntryPoint
class MainActivity : AppCompatActivity() {

@Inject lateinit var retrofit: Retrofit

person Aditya Kurkure    schedule 20.09.2020    source источник
comment
Можете ли вы опубликовать свой код активности?   -  person iamanbansal    schedule 20.09.2020
comment
@iamanbansal, как уже упоминалось, я ввожу в основное действие. Я добавил строку, в которую я его вводил.   -  person Aditya Kurkure    schedule 20.09.2020
comment
Вам нужно добавить код объявления класса Activity любым изменением, не забыли ли вы добавить аннотацию @AndroidEntryPoint к Activity?   -  person ADM    schedule 20.09.2020
comment
Нет, я добавил, что @ADM   -  person Aditya Kurkure    schedule 20.09.2020
comment
А как насчет класса приложения? Вы использовали аннотацию @HiltAndroidApp?   -  person Thracian    schedule 20.09.2020
comment
@Thracian Да, я тоже добавил это в свой манифест.   -  person Aditya Kurkure    schedule 20.09.2020
comment
Да, проверь и свой application класс   -  person milad salimi    schedule 20.09.2020
comment
Не в манифесте, в вашем классе Application вы должны использовать @HiltAndroidApp? Вы им пользовались?   -  person Thracian    schedule 20.09.2020
comment
Да @Thracian у меня есть   -  person Aditya Kurkure    schedule 20.09.2020
comment
Мне кажется, что ваша установка хороша. Попробуйте сделать недействительной и перезапустить Studio или пересобрать проект. он должен работать нормально.   -  person ADM    schedule 20.09.2020
comment
Тогда это должно сработать. Очистите файлы сборки, сделайте недействительным кеш и перезапустите   -  person Thracian    schedule 20.09.2020
comment
Поделитесь своим api interface, вы использовали Retrofit до сих пор?   -  person milad salimi    schedule 20.09.2020
comment
@miladsalimi, но проблема все еще присутствует при внедрении модернизации. Я не понимаю, как совместное использование моего интерфейса api может помочь.   -  person Aditya Kurkure    schedule 20.09.2020
comment
@ADM Пробовал, что все еще не работает   -  person Aditya Kurkure    schedule 20.09.2020
comment
@ADM Я пробовал написать такой же код на java, и он почему-то работает   -  person Aditya Kurkure    schedule 20.09.2020
comment
@AdityaKurkure Я попробовал ваш код, и у меня он отлично работает.   -  person iamanbansal    schedule 20.09.2020
comment
@iamanbansal, может, дело в зависимостях?   -  person Aditya Kurkure    schedule 20.09.2020
comment
Я добавил путь к классу в Gradle уровня проекта и 2 плагина, 2 зависимости в файле Gradle уровня приложения. Также изменились параметры компиляции   -  person Aditya Kurkure    schedule 20.09.2020


Ответы (2)


Я думаю, что ваш тип возврата для модернизации неверен. Попробуйте это (у меня это сработало):

@Singleton
@Provides
fun provideRetrofit (gson: Gson): Retrofit.Builder() {
   return Retrofit.Builder()
        .baseUrl("Base Url")
        .addConverterFactory(GsonConverterFactory.create(gson))
        .addCallAdapterFactory(RxJava3CallAdapterFactory.create())
}

РЕДАКТИРОВАТЬ: О, и измените class RetrofitModule на object RetrofitModule! В противном случае @Provides никогда не выполняется. И имейте в виду, что вы можете использовать свое дооснащение только после onCreate()

person Andrew    schedule 20.09.2020
comment
Спасибо, но если бы тип возврата был неправильным, я не думаю, что это могло бы быть выполнено (я все же попробовал, и это не сработало). И с объектом тоже не работает - person Aditya Kurkure; 20.09.2020

Попробуйте изменить свой код следующим образом:

@Module
@InstallIn(ApplicationComponent::class)
Object RetrofitModule {

    @Singleton
    @Provides
    fun provideRetrofit (gson: Gson): Retrofit{
       return Retrofit.Builder().baseUrl("Base Url")
            .addConverterFactory(
                   GsonConverterFactory.create(GsonBuilder().create())
             )
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create()).build()
    }
}

Вместо создания класса попробуйте создать объект. Не создавайте Gson в отдельной функции. У меня тоже возникает эта ошибка, когда я использую конвертер moshi.

person Rachman Abda'u    schedule 03.11.2020