私のモジュール、ベースの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);
}
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'
これが新しい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"
たぶん、@ModuleでModuleClassに注釈を付けるのを忘れましたか?
上記のコードにはいくつかの小さな誤解/欠陥がありますが、ここに実装があります:
Application.Java:
component = DaggerComponentClass.builder().classModule(new ModuleClass()).build();
生成されたクラスは、DaggerComponentClass
ではなく、DaggerCompClassComponent
という名前になります。 Android Studioでアプリを実行してビルドできない場合は、メニューで[ビルド]-> [プロジェクトのクリーンアップ]および[ビルド->プロジェクトの再ビルド]を試してください。すべてが正常であれば、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...
}
モジュールはコード内で正しいため、注釈を付けてください。
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 の完全な短剣ドキュメントを参照
AndroidStudioに複数のモジュール(DaggerではなくAndroid Studioのモジュール)がある場合、失敗の別の考えられる理由は、すべてのモジュールの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'
Kotlinを使用している場合は、ビルドスクリプトにkapt
(Kotlinアノテーションプロセッサ)Gradleプラグインを追加し、Daggerコンパイラではkapt
の代わりにannotationProcessor
Gradle依存関係タイプを使用してください。
apply plugin: 'kotlin-kapt
kapt deps.daggercompiler
implementation deps.dagger
Dagger2がそのコンポーネントを生成できない場合、コードにスコープ/モジュールに関するエラーがあることを意味します。 @ Provides/Injectメソッドを確認してください。
PD:
モジュールによって提供されるクラスのインスタンスが必要な場合にコンポーネントを注入する必要があります。
好む
inject(MainActivity main);
//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'