组件(无作用域)可能不引用作用域绑定

Posted

技术标签:

【中文标题】组件(无作用域)可能不引用作用域绑定【英文标题】:Component (unscoped) may not reference scoped bindings 【发布时间】:2018-02-22 01:08:48 【问题描述】:

我最近开始在 kotlin 中使用 dagger-2。不幸的是,我发现 sumbcomponants 存在问题,但我无法理解为什么会出现此 gradle 错误:

...NetComponent (unscoped) may not reference scoped bindings:
@dagger.Subcomponent(modules = 
com.example.kremik.cryptodroid.di.module.NetModule.class)
@Singleton @Provides com.example.kremik.cryptodroid.data.remote.CMCService com.example.kremik.cryptodroid.di.module.NetModule.providesCMCService(retrofit2.Retrofit)
@Singleton @Provides retrofit2.Retrofit com.example.kremik.cryptodroid.di.module.NetModule.providesRetrofit()
@org.jetbrains.annotations.NotNull @Singleton @Provides com.example.kremik.cryptodroid.data.service.CurrencyDataPresenter com.example.kremik.cryptodroid.di.module.NetModule.providesCurrencyDataPresenter(com.example.kremik.cryptodroid.data.local.CurrenciesProvider, com.example.kremik.cryptodroid.ui.LivePrices.LivePricesPresenter)

模块:应用程序

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'

android 
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig 
    applicationId "com.example.kremik.cryptodroid"
    minSdkVersion 19
    targetSdkVersion 26
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner     
"android.support.test.runner.AndroidJUnitRunner"

configurations.all 
    resolutionStrategy.force 'com.google.code.findbugs:jsr305:1.3.9'

buildTypes 
    release 
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'),     
'proguard-rules.pro'
    

//    dataBinding 
//        enabled = true
//    
kapt 
    generateStubs = true



dependencies 
 (...)
//Dagger2
implementation 'com.google.dagger:dagger:2.11'
implementation 'com.google.dagger:dagger-android-support:2.11'
implementation 'com.google.dagger:dagger-android-processor:2.11'
kapt 'com.google.dagger:dagger-compiler:2.11'
(...)

网络模块: @模块 类 NetModule(private val BASE_URL: String)

@Provides
@Singleton
fun providesCurrencyDataPresenter(provider: CurrenciesProvider,
                                  pricesPresenter: LivePricesPresenter) =
        CurrencyDataPresenter(provider, pricesPresenter)

@Provides
@Singleton
fun providesRetrofit() = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .addConverterFactory(GsonConverterFactory.create())
        .build()

@Provides
@Singleton
fun providesCMCService(retrofit: Retrofit) = 
retrofit.create(CMCService::class.java)

网络组件:

@Subcomponent(modules = arrayOf(NetModule::class))
interface NetComponent 
fun inject(service: CurrencyDownloaderService)

有谁知道可能是什么问题?

【问题讨论】:

你必须为组件添加相同的范围,尝试:@Singleton @Subcomponent(modules = arrayOf(NetModule::class)) 我没有帮助,因为它不应该提供帮助:***.com/questions/37797519/… Problems with singletons when using component dependencies的可能重复 子组件中的模块应具有与父组件相同的范围。尝试为您的模块使用自定义范围 错误信息告诉你到底哪里出了问题。您的子组件没有作用域。它不能引用作用域 (@Singleton) 绑定。解决方案是为您的子组件定义一个新范围 【参考方案1】:

将@Singleton 与您的组件放在一起

@Singleton
@Subcomponent(modules = arrayOf(NetModule::class))
interface NetComponent 
fun inject(service: CurrencyDownloaderService)

【讨论】:

这对我有帮助,但你能解释一下为什么在这里添加单例注释很重要吗? 谢谢!不过,我有一个鬼鬼祟祟的错误:确保它是 Javax 的 javax.inject.Singleton!我不小心导入了 Guice 的 com.google.inject.Singleton 并且玩得很糟糕......

以上是关于组件(无作用域)可能不引用作用域绑定的主要内容,如果未能解决你的问题,请参考以下文章

函数的作用域和名称空间

JS语法作用域与绑定图示

javaScript闭包

组件:使用slot进行内容分发

GroovyGroovy 脚本调用 ( Groovy 脚本中的作用域 | 本地作用域 | 绑定作用域 )

实现闭包(摘录自 权威指南184页)