Dagger2循环依赖性错误

时间:2018-07-18 10:59:28

标签: dagger-2

我在我的android项目中使用dagger2 2.16版本进行依赖注入。我研究了许多示例,尽管我没有类似的方法,但出现了“循环依赖”错误。 矿山源代码; AppComponent.kt

@Singleton
@Component(
        modules = [
            AndroidSupportInjectionModule::class,
            AppModule::class,
            ActivityBuilderModule::class]
)
interface AppComponent {
    @Component.Builder
    interface Builder {
        @BindsInstance
        fun application(application: Application): Builder

        fun build(): AppComponent
    }

    fun inject(app: App)
}

App.kt

class App : Application(), HasActivityInjector {

    @Inject
    lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Activity>

    override fun onCreate() {
        super.onCreate()
        AppInjector.init(this)
        initOneSignal()
    }

    private fun initOneSignal() = OneSignal.startInit(this).setNotificationOpenedHandler(CustomNotificationOpenedHandler()).inFocusDisplaying(OneSignal.OSInFocusDisplayOption.Notification).init()


    override fun activityInjector() = dispatchingAndroidInjector
}

ActivityBuilderModule.kt

@Module
abstract class ActivityBuilderModule {
    @ContributesAndroidInjector
    abstract fun contributeSplashActivity(): SplashActivity
}

AppModule.kt

@Module(includes = [(ViewModelModule::class)])
class AppModule {

    @Singleton
    @Provides
    fun provideContext(app: Application): Context = app.applicationContext;

    @Singleton
    @Provides
    fun provideApiService(client: OkHttpClient): ApiService {
        return Retrofit.Builder()
                .baseUrl(Constants.baseUrl)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build()
                .create(ApiService::class.java)
    }

    @Singleton
    @Provides
    fun provideOkHttpClient(interceptor: HttpLoggingInterceptor): OkHttpClient {
        return OkHttpClient.Builder().addInterceptor(interceptor).build()
    }

    @Singleton
    @Provides
    fun provideHttpLoggingInterceptor(): HttpLoggingInterceptor {
        val interceptor = HttpLoggingInterceptor()
        interceptor.level = HttpLoggingInterceptor.Level.BODY
        return interceptor
    }
}

如果我从AppComponent中删除ActivityBuilderModule,则项目编译不会出现问题。但是,如果您添加到模块部分,则该项目将显示以下错误。

  

错误:[ComponentProcessor:MiscError]   dagger.internal.codegen.ComponentProcessor无法处理此问题   接口,因为不是所有的依赖关系都可以解决。校验   编译错误或生成代码的循环依赖性。

请帮助我。

2 个答案:

答案 0 :(得分:2)

在App.kt中,您需要使用应用程序上下文初始化组件。线

AppInjector.init(this)

应该在Activity内,即您要在其中注入依赖项的splashActivity。

答案 1 :(得分:0)

也可能会出现上述错误消息,因为未将kotlin stdlib声明为依赖项。所以添加例如您的build.gradle(.kts)文件中的implementation("org.jetbrains.kotlin:kotlin-stdlib:1.3.60")也可能会有所帮助。