2017-06-28 17 views
3

私はKotlin言語でClean Architectureと依存関係注入を学ぶためにDagger 2をテストアプリケーションに実装しようとしています。Dagger2とKotlinが失敗しました原因:app:compileDebugKotlinAfterJava

EDIT :
I can compile thanks to @Logain, but I have always the static member problem with Dagger in my singleton (see below my TaskWorker), so I'm looking for how can I fix this error

しかし、私は問題を抱えて、私はは私がテストのために私のアプリを実行する場合、それは失敗し、消えを再構築しますが、していないとき、私のDaggerComponentがよく生成されます。それは、このエラーで失敗します。私は再構築を行うときながら

Error:(21, 29) Unresolved reference: DaggerInjectorComponent

Error:Execution failed for task ':app:compileDebugKotlinAfterJava'.

> Compilation error. See log for more details

、このタスクは、それが失敗した理由を私は理解していない正しく

:app:compileDebugKotlinAfterJava 

渡されます。

@Singleton 
@Component(modules = arrayOf(ContextDaggerModule::class, LocalStoreDaggerModule::class)) 
interface InjectorComponent { 

    fun inject(realmLocalStore: RealmLocalStore) 

    fun inject(taskWorker: TaskWorker) 

} 

ContectDaggerModule

@Module 
class ContextDaggerModule (val app: Application) { 

    @Provides 
    @Singleton 
    fun provideContext(): Context = app 

    @Provides 
    @Singleton 
    fun provideApplication(): Application = app 

    @Provides 
    @Singleton 
    fun provideResources(): Resources = app.resources 

} 

LocalStoreDaggerModule

@Module 
class LocalStoreDaggerModule { 

    @Provides 
    @Singleton 
    fun provideLocalStore(context: Context): LocalStore { 
     return RealmLocalStore(context) 
    } 

} 
ここ

は私のInjectorComponentです

私はObject-declarationsに依存関係を注入するために問題が発生したと思うが、すべての要素は静的であり、Daggerはそれを感謝しない。 だから、私は単純なオーバーライドゲッターとデータを注入するが、nopをハックしようとしている。

object TaskWorker { 

    // @Inject lateinit var localStore: LocalStore 
    // Not work cause it's a static variable 

    var localStore: LocalStore? = null 
     @Inject 
     get() = localStore 

    // some cool function 
} 

私はこのcodeに従うと、このtutorial

が、私はこれらの依存関係を使用します:

// Dagger2 
    compile 'com.google.dagger:dagger:2.11' 
    kapt 'com.google.dagger:dagger-compiler:2.11' 
    provided 'org.glassfish:javax.annotation:10.0-b28' 
+0

'localStore'に' @ JvmField'を付けてみてください。それが動作しない場合は、 'gradlew build --debug --stacktrace'を実行してスタックトレースを貼り付けてください。 – Mibac

+0

@Mibac私の' localStore'にカスタムゲッターがあるので、この注釈を適用できません。 – MrLeblond

+0

別の変数を作成してください@ JvmField'アノテーションと '@ Inject'アノテーション)、またはカスタムゲッターを削除して、ゲッターが問題になっているかどうかをテストします。 もし '--debug --stacktrace'引数でgradleを実行してください。私たちは例外が何であるかを確認することができます – Mibac

答えて

1

使用していることを確認してください:

ここ

は私の "ハック" です

kapt { 
    generateStubs = true 
} 

何らかのlimitations on kapt

したり、ただで試してみてください。

annotationProcessor 'com.google.dagger:dagger-compiler:2.11' 
+0

はい私はkaptを使用していますが、私はこのannotationProcessorを忘れていました。 – MrLeblond

+0

しかし、ゲッターを無効にすることで静的なvarに注入する私の "ハック"は動作しません – MrLeblond

0

あなたはこれを必要としません。

kapt { 
    generateStubs = true 
} 

ただ、プラグイン適用されます。

apply plugin: 'kotlin-kapt' 

をし、依存関係を追加します。

compile androidDependencies.dagger2 
compile androidDependencies.dagger2Android 
kapt androidDependencies.dagger2Kapt 

は時々タスクは、そのようなエラーで失敗します。 cleanに最後の手段としてinvalidate and restartを使用してください。ほとんどの場合、それは動作します。