Зависимый компонент кинжала выдает ошибку - PullRequest
0 голосов
/ 01 мая 2019

Я застрял здесь с зависимым компонентом кинжала, выдавшим ошибку android.content.Context не может быть предоставлен без аннотированного @ Provides метода.

Вот мой CoreDataComponent , который генерирует коддля coreDataModule и contextModule

@Singleton
@Component( modules = [
        CoreDataModule::class,
        ContextModule::class
    ]
)
interface CoreDataComponent{

    @Component.Builder interface Builder {
        fun build(): CoreDataComponent

        fun coreDataModule(coreDataModule: CoreDataModule) : Builder
        fun contextModule(contextModule: ContextModule) : Builder
    }
}

CoreDataModule

@Module
class CoreDataModule {
    @Provides
    fun provideLoggingInterceptor(): HttpLoggingInterceptor {
        return HttpLoggingInterceptor().apply {
            level = if (BuildConfig.DEBUG) {
                HttpLoggingInterceptor.Level.BODY
            } else {
                HttpLoggingInterceptor.Level.NONE
            }
        }
    }

    @Provides
    fun provideOkHttpClient(context: Context): OkHttpClient =
        OkHttpClient.Builder()
            .addInterceptor(provideLoggingInterceptor())
            .addInterceptor(ChuckInterceptor(context))
            .addInterceptor { chain ->
                val url = chain.request().url().newBuilder().addQueryParameter("access_token", "").build()
                val request = chain.request().newBuilder().url(url).build()

                chain.proceed(request)
            }
            .cache(null)
            .build()

    @Provides
    fun provideRetrofit(
        okHttpClient: OkHttpClient
    ): Retrofit {
        return Retrofit.Builder()
            .baseUrl(BuildConfig.BASE_DOMAIN)
            .addConverterFactory(MoshiConverterFactory.create())
            .addCallAdapterFactory(CoroutineCallAdapterFactory())
            .client(okHttpClient)
            .build()
    }

}

ContextModule

@Module
class ContextModule(val context: Context) {

    @Provides
    fun provideApplicationContext(): Context {
        return context
    }
}

Вот мой зависимый компонент

@Component(
    modules = [
        AuthDataModule::class,
        AuthViewModelModule::class
    ],
    dependencies = [
        CoreDataComponent::class
    ]
)
@ActivityScope
interface AuthDataComponent {
    @Component.Builder interface Builder {
        fun build() : AuthDataComponent

        fun coreDataComponent(coreDataComponent: CoreDataComponent) : Builder
        /*@BindsInstance
        fun activityContext(context: Context) : Builder*/
    }

    fun inject(authenticationActivity: AuthenticationActivity)
    fun inject(loginFragment: LoginFragment)
    ....
}

Вот как я собираю CoreDataComponent и AuthDataComponent

class Application : Application() {

    private val coreDataComponent: CoreDataComponent by lazy {
        DaggerCoreDataComponent
            .builder()
            .coreDataModule(CoreDataModule())
            .contextModule(ContextModule(this))
            .build()
    }

    companion object {
        @JvmStatic
        fun coreDataComponent(context: Context) =
            (context.applicationContext as Application).coreDataComponent
    }

}

/// Injection
fun AuthenticationActivity.inject() {
    DaggerAuthDataComponent.builder()
        .coreDataComponent(Application.coreDataComponent(this))
        //.activityContext(this)
        .build()
        .inject(this)

Журнал ошибок

error: android.content.Context cannot be provided without an @Provides-annotated method.
    public abstract void inject(@org.jetbrains.annotations.NotNull()

android.content.Context is injected at
          com.stylabs.collabb.core.dagger.module.CoreDataModule.provideOkHttpClient(context)   

Я не понимаю этогородительский компонент уже предоставил контекст.

Обновление 1 Это происходит только в том случае, если я внедряю AuthDataComponent Dependancy во фрагмент, не выдавая ошибку в Activity

Update2 Вот полная трассировка ошибки

 public abstract void inject(@org.jetbrains.annotations.NotNull()
                         ^
      android.content.Context is injected at
          com.stylabs.collabb.core.dagger.module.CoreDataModule.provideOkHttpClient(context)
      okhttp3.OkHttpClient is injected at
          com.stylabs.collabb.core.dagger.module.CoreDataModule.provideRetrofit(okHttpClient)
      retrofit2.Retrofit is injected at
          com.stylabs.collabb.features.auth.data.dagger.module.AuthDataModule.providesAuthApi(retrofit)
      com.stylabs.collabb.features.auth.data.source.AuthApi is injected at
          com.stylabs.collabb.features.auth.data.dagger.module.AuthDataModule.providesAuthRemoteDataSource(authApi)
      com.stylabs.collabb.features.auth.data.source.AuthRemoteDataSource is injected at
          com.stylabs.collabb.features.auth.data.dagger.module.AuthDataModule.providesAuthRepository(authRemoteDataSource)
      com.stylabs.collabb.features.auth.data.source.AuthRepository is injected at
          com.stylabs.collabb.features.auth.data.AuthViewModel.<init>(authRepository)
      com.stylabs.collabb.features.auth.data.AuthViewModel is injected at
          com.stylabs.collabb.features.auth.login.ui.LoginFragment.authViewModel
      com.stylabs.collabb.features.auth.login.ui.LoginFragment is injected at
          com.stylabs.collabb.features.auth.data.dagger.component.AuthDataComponent.inject(loginFragment)
...