web-dev-qa-db-ja.com

ダガーとコトリン。 Daggerはコンポーネントクラスを生成しません

KotlinとDaggerが初めてです。解決方法がわからないという小さな問題があり、解決策が見つかりません。

だからこれは私が持っているものです:

_@Module
class AppModule (app: Application) {
    private var application: Application;

    init {
        this.application = app;
    }

    @Provides fun provideApplication(): Application? {
        return application;
    }

    @Provides fun provideResources(): Resources? {
        return application.resources;
    }
}

@Singleton
@Component(modules =  arrayOf(AppModule::class))
interface AppComponent: AppComponentBase {

    public class Initializer {
        private constructor(){}

        companion object {
            fun Init(app: Application): AppComponent? {
                return DaggerAppComponent.builder().appModule(AppModule(app)).build()
            }
        }
    }
}
_

AppComponentBase:このインターフェイスには、このコンポーネントに必要なすべてのメソッドが含まれます。

現在、問題は、_companion object_内でこのDaggerAppComponent.builder().appModule(AppModule(app)).build()呼び出しを行うと、このDaggerAppComponentクラスがDaggerによって生成されないことです。同じ行を呼び出した場合、_companion object_ daggerが問題なくクラスを生成します。

私が解決策を探した他のことは、同じ構造を持つ別の異なるクラスを作成し、DaggerAppComponentを内部オブジェクトとしてインポートし、同じ結果が生じたことです。

外部でコンポーネントの初期化を行う必要はありません。だから、他の代替ソリューションがありますか、私は何を間違っていますか?.

36
Leo

Build.gradleに kapt processor が必要です:

kapt {
    generateStubs = true
}

dependencies {
    ...
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'com.google.dagger:dagger:2.0.2'
    kapt 'com.google.dagger:dagger-compiler:2.0.2'
    ...
}

この拡張機能は、短剣のコードを生成します。

さらに、新しいgradleバージョンの場合、build.gradleでプラグインを適用することもできます。

apply plugin: 'kotlin-kapt'

dependencies {
    ...
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile 'com.google.dagger:dagger:2.0.2'
    kapt 'com.google.dagger:dagger-compiler:2.0.2'
    ...
}

このプロジェクト を参照して確認できます

88

この変更がいつ発生したかはわかりませんが、1.1.2のKotlin gradleプラグインでこれを置き換えます(モジュールのbuild.gradle):

kapt {
    generateStubs = true
}

これとともに:

apply plugin: 'kotlin-kapt'

そして、annotationProcessorを使用する依存関係をkaptに置き換えてください。

たとえば、古い方法は次を使用することです。

annotationProcessor (
    'some.library:one:1.0'
    ...
    'some.library.n:n.0'
)

そして今、あなたは使用します:

kapt (
    'some.library:one:1.0'
    ...
    'some.library.n:n.0'
)
19
Plumbus

KOTLIN 1.1.4のアップデート

generateStubsはもう機能しません。最新のKotlinを使用してビルドを作成すると、Android StudioのMessagesセクションここでは、 Dagger2 for Android およびKotlinの依存関係の最新リストを示します。

apply plugin: 'kotlin-kapt'

//...
// Other Gradle stuff
//...

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:1.1.4-3"

    compile 'com.google.dagger:dagger-Android:2.12'
    kapt 'com.google.dagger:dagger-Android-processor:2.12'
    compileOnly 'com.google.dagger:dagger:2.12'
    kapt 'com.google.dagger:dagger-compiler:2.12'
}
12
Solidak

この問題は、元の回答とは異なる以下の変更で修正できます

以下は、この問題を修正するのにも役立ちます

プラグイン付き

apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-kapt'

および依存関係

implementation "com.google.dagger:dagger:$dagger_version"
implementation "com.google.dagger:dagger-Android:$dagger_version"
implementation "com.google.dagger:dagger-Android-support:$dagger_version" 
kapt "com.google.dagger:dagger-compiler:$dagger_version"
kapt "com.google.dagger:dagger-Android-processor:$dagger_version"

参考のため、こちらをご覧ください Gist

4
Devishankar

DaggerComponentに問題がある場合は、追加する必要があります

apply plugin: 'kotlin-kapt'

kapt {
    generateStubs = true
}

build.gradleitはdagger 2kotlinコードを生成します。そうでない場合、プロジェクトはRebuildのみでビルドされます

0
Minis