web-dev-qa-db-ja.com

生成されない短剣2コンポーネント

私のモジュール、ベースのApplicationクラス

component = DaggerCompClassComponent.builder()
                .classModule(new ModuleClass()).build();

daggerCompClassComponentが見つかりません。

私はbuild.gradleモジュールを持っています

apply plugin: 'com.neenbedankt.Android-apt'
.........................
apt 'com.google.dagger:dagger-compiler:2.8'
compile 'com.google.dagger:dagger:2.8'
provided 'javax.annotation:jsr250-api:1.0'

project build.gradleでは、

 classpath 'com.neenbedankt.gradle.plugins:Android-apt:1.8'

プロジェクトのビルド/再構築/クリーニング/再起動を完了しました。オブジェクトを注入するComponentクラスと、注入するオブジェクトを提供するModuleClassがあります。

Dagger Componentを生成しない原因は何ですか。クラス?

編集:

これは、@ Moduleの注釈が付いた私のModuleClassです。

@Provides
@Singleton
public Interceptor provideInterceptor() {
    return new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request.Builder builder = chain.request().newBuilder();

            builder.addHeader("AppName-Android", BuildConfig.VERSION_NAME + "-" + BuildConfig.VERSION_CODE)
                    .addHeader("Content-Type", "application/json");

            return chain.proceed(builder.build());
        }
    };
}

@Provides
@Singleton
OkHttpClient provideOkHttpClient(Interceptor interceptor) {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.interceptors().add(interceptor);
    return builder.build();
}

@Provides
@Singleton
Retrofit provideRetrofit(OkHttpClient client) {
    return new Retrofit.Builder()
            .baseUrl(BaseApplication.getRes().getString(R.string.api_base_url))
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build();
}

@Provides
@Singleton
WebServiceCall provideWebService(Retrofit retrofit) {
    return retrofit.create(WebServiceCall.class);
}

そして、これは私のコンポーネントクラスです:

@Component(modules = ModuleClass.class)
@Singleton
public interface ComponentClass {

    void inject(Interceptor o);
    void inject(OkHttpClient o);
    void inject(Retrofit o);
    void inject(WebServiceCall o);

}
32
ghita

Kotlinで開発する場合、対応するannotationProcessorの横に次の行を追加する必要があります。

kapt 'com.google.dagger:dagger-Android-processor:2.15'
kapt 'com.google.dagger:dagger-compiler:2.15'

同じファイルの先頭にapply plugin: 'kotlin-kapt'を追加します。

私にとっては、このセクションは次のようになります。

apply plugin: 'com.Android.application'
apply plugin: 'kotlin-Android'
apply plugin: 'kotlin-kapt' // <- Add this line
apply plugin: 'io.fabric'
68
Gonzalo

これが新しいDaggerプロジェクトのソリューションです。

これらの2行は、Dagger 2でコンパイル時フレームワークを生成する役割を果たします。

compile 'com.google.dagger:dagger:2.14.1' //コンパイル時にフレームワークを生成しますannotationProcessor 'com.google.dagger:dagger-compiler:2.14.1' //指定した注釈に基づいてコンパイル時にフレームワークを生成します。

フルセットアップダガー

        //dagger 2
        compile 'com.google.dagger:dagger:2.14.1'
        annotationProcessor 'com.google.dagger:dagger-compiler:2.14.1'

        //to enable DaggerActivity, DaggerBroadcastReceiver, DaggerFragment etc classes
        compile 'com.google.dagger:dagger-Android:2.14.1'
        annotationProcessor 'com.google.dagger:dagger-Android-processor:2.14.1'

        //support libraries with dagger 2
        compile 'com.google.dagger:dagger-Android-support:2.14.1'

:以下のスクリーンショットに示されているように、注釈プロセスを構成する必要があります。これを行うことができますFile>Other Settings>Default Settings>search"Annotation processor"enter image description here

25
Uddhav Gautam

たぶん、@ModuleでModuleClassに注釈を付けるのを忘れましたか?

6
Alex Shutov

上記のコードにはいくつかの小さな誤解/欠陥がありますが、ここに実装があります:

Application.Java:

component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();

生成されたクラスは、DaggerComponentClassではなく、DaggerCompClassComponentという名前になります。 Android St​​udioでアプリを実行してビルドできない場合は、メニューで[ビルド]-> [プロジェクトのクリーンアップ]および[ビルド->プロジェクトの再ビルド]を試してください。すべてが正常であれば、DaggerはDaggerComponentClassと同じパッケージにあるComponentClassをコンパイルします。

ComponentClass.Java:

@Component(modules = ModuleClass.class)
public interface ComponentClass {
    void inject(AClassThatShouldGetInstancesInjected instance);
}

Dagger2のコンポーネントには、インスタンスを受け取るためにインスタンスを受け取るinjectという名前のメソッドがあり、その逆ではありません。上記のコードでは、クラスAClassThatShouldGetInstancesInjectedは通常、componentClass.inject(this);を呼び出してインスタンスを自身に挿入します。

ModuleClass.Java:

@Module
public class ModuleClass {
    @Provides
    @Singleton
    public Interceptor provideInterceptor() {/*code*/}

    //Your Providers...
}

モジュールはコード内で正しいため、注釈を付けてください。

3
Pär Nils Amsen

Build.gradleのアプリでは、以下のように、対応するクラスを生成するためにDaggerに必要な依存関係を追加する必要があります。

  implementation 'com.google.dagger:dagger-Android:2.21'
  implementation 'com.google.dagger:dagger-Android-support:2.21' // if you use the support libraries
  annotationProcessor 'com.google.dagger:dagger-Android-processor:2.21'
  annotationProcessor 'com.google.dagger:dagger-compiler:2.21'

使用している短剣のバージョンを変更する必要があります。

this の完全な短剣ドキュメントを参照

2
Mr Special

AndroidStudioに複数のモジュール(DaggerではなくAndroid St​​udioのモジュール)がある場合、失敗の別の考えられる理由は、すべてのモジュールのbuild.gradleに注釈プロセッサを配置するのを忘れたことです。

アプリをいくつかのモジュールに分割し、依存関係をimplementationの使用からapiの使用に更新しましたが、それに応じて注釈プロセッサを処理するのを忘れていました。

したがって、ルートモジュールにのみこの行を含めることができます。

api 'com.google.dagger:dagger-Android:2.16'
// if you use the support libraries
api 'com.google.dagger:dagger-Android-support:2.16'

ただし、これはすべてのモジュールの依存関係で指定する必要があります。

annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
// if you use injections to Android classes
annotationProcessor 'com.google.dagger:dagger-Android-processor:2.16'
2
Gaket

Kotlinを使用している場合は、ビルドスクリプトにkapt(Kotlinアノテーションプロセッサ)Gradleプラグインを追加し、Daggerコンパイラではkaptの代わりにannotationProcessor Gradle依存関係タイプを使用してください。

apply plugin: 'kotlin-kapt

kapt deps.daggercompiler
implementation deps.dagger
2

Dagger2がそのコンポーネントを生成できない場合、コードにスコープ/モジュールに関するエラーがあることを意味します。 @ Provides/Injectメソッドを確認してください。

PD:

モジュールによって提供されるクラスのインスタンスが必要な場合にコンポーネントを注入する必要があります。

好む

inject(MainActivity main);
1
Anton Kazakov
//add all the dependencies otherwise component class will not be generated.
implementation 'com.google.dagger:dagger-Android:2.21'
implementation 'com.google.dagger:dagger-Android-support:2.21'
annotationProcessor 'com.google.dagger:dagger-Android-processor:2.21'
implementation 'com.google.dagger:dagger:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
0
sudhanshu