Как внедрить экземпляр приложения в @Provides? - PullRequest
0 голосов
/ 06 июня 2019

My AppModule вылетает во время компиляции с ошибкой:

error: .App cannot be provided without an @Inject constructor or from an @Provides-annotated method.
    public abstract .vcs.IGitHubApi getGitHubApi();
                                                       ^
      .App is injected at
          .AppModule.provideOAuth2Interceptor(app)
      .vcs.OAuth2Interceptor is injected at
          .AppModule.provideOkHttpClient(…, oAuth2Interceptor)
      okhttp3.OkHttpClient is injected at
          .AppModule.provideRetrofit(httpClient, …)
      retrofit2.Retrofit is injected at
          .AppModule.provideGitHubApi(retrofit)
      .vcs.IGitHubApi is provided at
          .AppComponent.getGitHubApi()

Вот мой AppModule класс:

@Module
class AppModule {

    // other providers

    @Singleton
    @Provides
    fun provideOAuth2Interceptor(app: App): OAuth2Interceptor {
        return OAuth2Interceptor(app)
    }
}

AppComponent:

@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {

    // other methods

    fun inject(app: App)

    @Component.Builder
    interface Builder {
        @BindsInstance
        fun context(context: Context): Builder

        fun build(): AppComponent
    }
}

И мой App класс, где я инициализирую AppComponent:

class App: Application() {

    override fun onCreate() {
        super.onCreate()

        DaggerAppComponent.builder()
            .context(this)
            .build()
            .inject(this)
    }
}

Я понимаю, что Кинжал не может найти App, чтобы построить provideOAuth2Interceptor, но я неНе знаю, как вводить App в провайдера.

PS Я учусь Кинжал все еще.

1 Ответ

1 голос
/ 07 июня 2019

В вашем AppComponent вы должны привязать экземпляр вашего класса App, чтобы сделать его частью графа Даггера.

@Component.Builder
    interface Builder {
        @BindsInstance
        fun context(context: Context): Builder

        @BindsInstance
        fun application(app: App): Builder

        fun build(): AppComponent
    }

, а в своем классе App предоставить экземпляр App компонентуво время строительства -

DaggerAppComponent.builder()
    .context(this)
    .application(this)
    .build()
    .inject(this)
...