Ошибка: [dagger.android.AndroidInjector.inject (T)] Обнаружен цикл зависимости

Может ли кто-нибудь сказать мне, почему появляется эта ошибка. Я пробовал много сообщений о stackoverflow, но не могу идентифицировать. Целый день борюсь с этой ошибкой. до кинжала 2.11 он работал нормально. после обновления до 2.11 ошибка.

        E:\studio projects\MVP-Login\app\build\tmp\kapt3\stubs\debug\com\example\anbu\mvpkotlin\di\component\AppComponent.java:8: error: [dagger.android.AndroidInjector.inject(T)] Found a dependency cycle:
public abstract interface AppComponent {
            ^
  com.example.anbu.mvpkotlin.data.network.NccApi is injected at
      com.example.anbu.mvpkotlin.di.modules.AppModules.provideAPI$app_debug(apiManager)
  com.example.anbu.mvpkotlin.data.network.NccApi is injected at
      com.example.anbu.mvpkotlin.ui.accounts.interactor.AccountInteractor.<init>(…, api)
  com.example.anbu.mvpkotlin.ui.accounts.interactor.AccountInteractor is injected at
      com.example.anbu.mvpkotlin.ui.accounts.AccountModule.provideAccountInteractor$app_debug(accountInteractor)
  com.example.anbu.mvpkotlin.ui.accounts.interactor.AccountInteractorContract is injected at
      com.example.anbu.mvpkotlin.ui.accounts.presenter.AccountPresenter.<init>(interactor, …)
  com.example.anbu.mvpkotlin.ui.accounts.presenter.AccountPresenter<com.example.anbu.mvpkotlin.ui.accounts.view.AccountViewContract,com.example.anbu.mvpkotlin.ui.accounts.interactor.AccountInteractorContract> is injected at
      com.example.anbu.mvpkotlin.ui.accounts.AccountModule.provideAccountPresenter$app_debug(accountPresenter)
  com.example.anbu.mvpkotlin.ui.accounts.presenter.AccountPresenterContract<com.example.anbu.mvpkotlin.ui.accounts.view.AccountViewContract,com.example.anbu.mvpkotlin.ui.accounts.interactor.AccountInteractorContract> is injected at
      com.example.anbu.mvpkotlin.ui.accounts.view.AccountActivity.presenter
  com.example.anbu.mvpkotlin.ui.accounts.view.AccountActivity is injected at
      dagger.android.AndroidInjector.inject(arg0)

Вот мой класс AppComponent, который я добавил в свой проект. Это не совсем абстрактно, как показывает ошибка.

    @Singleton
@Component(modules = [(AndroidInjectionModule::class), (ActivityBuilder::class),
    (AppModules::class)])
interface AppComponent {

    @Component.Builder
    interface Builder {

        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }

    fun inject(app: MyApplication)

}

А вот и класс Application Module, который я добавил в свой проект.

@Module
class AppModules {

@Provides
@Singleton
internal fun provideContext(application: Application): Context = application

@Provides
@PreferenceInfo
internal fun providePrefName(): String = AppConstants.PREF_NAME

@Provides
@Singleton
internal fun providePreference(prefManager: PrefManager): 
PrefManagerContract = prefManager

@Provides
@Singleton
internal fun provideAppDatabase(context: Context): NccDatabase =
        Room.databaseBuilder(context, NccDatabase::class.java, "****")
                .allowMainThreadQueries()
                .fallbackToDestructiveMigration()
                .build()

@Provides
internal fun provideCompositeDisposable(): CompositeDisposable = 
CompositeDisposable()

@Provides
@Singleton
internal fun provideAPI(apiManager: NccApi): NccApi = apiManager

@Provides
internal fun provideSchedulerProvider(): SchedulerProvider = 
SchedulerProvider()

/*@Provides
@Singleton
internal fun providerTokenManager(): TokenManager = TokenManager()*/

Это мой класс AccountModule

            @Module
    class AccountModule {

        @Provides
        internal fun provideAccountInteractor(accountInteractor: AccountInteractor): AccountInteractorContract = accountInteractor

        @Provides
        internal fun provideAccountPresenter(accountPresenter: AccountPresenter<AccountViewContract, AccountInteractorContract>)
                : AccountPresenterContract<AccountViewContract, AccountInteractorContract> = accountPresenter
    }

Вот мой интерфейс веб-сервисов Retrofit

public interface NccApi {

        Observable<Profile> getProfile(@Url String url, @Header("authorization") String auth);

        @POST
        Call<SigninResponseModel> refreshToken(@Url String url, @Header("authorization") String auth, @Body RefreshTokenRequest body);
    }

Вот мой класс модуля модернизации

        @Module
    class RetrofitModule(internal var mBaseUrl: String) {

    @Provides
    @Singleton
    internal fun provideInterceptor(): okhttp3.Interceptor {
        val interceptorAPI = Interceptor { chain ->
            val original = chain.request()
            var request: Request? = null
            try {
                request = chain.request().newBuilder()
                        .addHeader("Content-Type", "application/json")
                        .method(original.method(), original.body())
                        .build()
            } catch (authFailureError: Exception) {
                authFailureError.printStackTrace()
            }

            val response = chain.proceed(request)

            response
        }
        return interceptorAPI
    }

    @Provides
    @Singleton
    internal fun provideGson(): Gson {
        val gsonBuilder = GsonBuilder()
        return gsonBuilder.create()
    }

    @Provides
    @Singleton
    internal fun provideOkHttpClient(interceptor: Interceptor): OkHttpClient {
        val okHttpBuilder = OkHttpClient.Builder()
        okHttpBuilder.interceptors().add(interceptor)
        val logging = HttpLoggingInterceptor()
        logging.setLevel(HttpLoggingInterceptor.Level.BODY)
        okHttpBuilder.interceptors().add(logging)
        val client = okHttpBuilder.build()
        return client
    }

    @Provides
    @Singleton
    internal fun provideRetrofit(gson: Gson, okHttpClient: OkHttpClient): Retrofit {
        val retrofit = Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(mBaseUrl)
                .client(okHttpClient)
                .build()
        return retrofit
    }
    }

Вот мой класс приложения

class MyApplication : Application(), HasActivityInjector {

    @Inject
    lateinit internal var activityDispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun activityInjector() = activityDispatchingAndroidInjector

    override fun onCreate() {
        super.onCreate()

        DaggerAppComponent.builder()
                .application(this)
                .appmodule(AppModules())
                .retrofitModule(RetrofitModule(""))
                .build()
                .inject(this)

    }
    }

Нам нужно увидеть ваши модули и компоненты, чтобы увидеть, как вы настроили кинжал.

Levi Moreira 11.05.2018 15:19

Я никогда не знал, что у вас может быть абстрактный интерфейс ... узнал что-то новое

Zun 11.05.2018 15:26

Я добавил свой код @Levi.

Anbarasu Chinna 11.05.2018 15:54

Это не абстрактно, проверьте мой код выше @ZUNJAE

Anbarasu Chinna 11.05.2018 15:54

Вам также необходимо опубликовать AccountModule

Levi Moreira 11.05.2018 15:58

добавлен класс модуля учетной записи @LeviAlbuquerque

Anbarasu Chinna 11.05.2018 16:00
0
6
1 782
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш цикл зависимости здесь:

@Provides
@Singleton
internal fun provideAPI(apiManager: NccApi): NccApi = apiManager

Вы зависите от apiManager, чтобы предоставить apiManager. У вас должно получиться что-то вроде этого:

@Provides
@Singleton
internal fun provideAPI(): NccApi = NccApi()

Вышеупомянутое - всего лишь пример, суть в том, что вам нужно создать экземпляр вашего API, чтобы предоставить его. Или, если у вас есть интерфейс, который реализует ваш apiManager, вы должны вернуть его из метода provide, поэтому вы запрашиваете фактический объект и возвращает интерфейс. Бу запрашивая реальный объект и возвращая его, вы прямо здесь выполняете цикл зависимостей.

но это мой интерфейс веб-службы для модернизации сетей. Я не могу создать объект для интерфейса ... Rit? ... проверьте класс веб-службы, добавленный выше ...

Anbarasu Chinna 11.05.2018 16:11

у вас нет оболочки для инициализации модифицированного интерфейса? Обычно у одного есть класс, в котором они делают retrofit.create(APIInterface.class);, и этот класс обычно предоставляется кинжалом.

Levi Moreira 11.05.2018 16:14

Да, я забыл об этом. Спасибо, что вспомнили обо мне. Теперь я удалил инъекцию NccApi в конструкторе презентатора, вместо этого я внедрил экземпляр Retrofit во все места в презентаторе. После этого я вызову retrofit.create (NccApi.class);

Anbarasu Chinna 11.05.2018 16:34

Но проблема все еще сохраняется. Не знаю почему

Anbarasu Chinna 11.05.2018 16:35

Хорошо, предположим, что ваша оболочка api называется RetrofitConfig, вы должны сделать это: внутреннее развлечение provideAPI (): RetrofitConfig = RetrofitConfig (), вы это делаете?

Levi Moreira 11.05.2018 16:36

Нет, вместо оболочки я напрямую вернул экземпляр Retrofit, используя отдельный провайдер. Как внутреннее развлечение, provideRetrofit (): Retrofit = Retrofit {/// конфигурация модернизации и возврат}

Anbarasu Chinna 11.05.2018 16:38

теперь у меня другая ошибка. ошибка: в @ Component.Builder отсутствуют сеттеры для требуемых модулей или компонентов: [com.example.anbu.mvpkotlin.data.network.RetrofitModule] Конструктор общедоступных статических абстрактных интерфейсов {^

Anbarasu Chinna 11.05.2018 16:42

надеюсь скоро исправлю проблему. Можешь помочь еще немного?

Anbarasu Chinna 11.05.2018 16:43

У вас есть модифицированный модуль? Могу я увидеть это?

Levi Moreira 11.05.2018 16:46

добавлены модуль модернизации и класс приложения

Anbarasu Chinna 11.05.2018 16:52

Я добавил забавный retrofitModule (retrofitModule: RetrofitModule): Builder в свой AppComponet в качестве установщика, это исправлено. Вы действительно классные. Я забыл создать оболочку для класса интерфейса. Это основная отправная точка для решения этой проблемы. Спасибо, чувак # Леви

Anbarasu Chinna 11.05.2018 17:05

Другие вопросы по теме