ダガーの新機能をテストしていました:Android module。そして@ContributesAndroidInjector
を使用するときにコードをコンパイルできません。常に次のエラーが発生します:
エラー:(12、8)エラー:dagger.internal.codegen.ComponentProcessorは、すべての依存関係を解決できなかったため、このインターフェイスを処理できませんでした。生成されたコードでコンパイルエラーまたは循環依存関係を確認します。
here のようなコンポーネントを実装しようとしましたが、それでもエラーが発生しました。
最小の例を次に示します。
@PerApplication
@Component(modules = {AndroidInjectionModule.class, LoginBindingModule.class})
public interface ApplicationComponent {
void inject(ExampleApplication application);
}
@Module
public abstract class LoginBindingModule {
@ContributesAndroidInjector
abstract LoginActivity contributeYourActivityInjector();
}
public class LoginActivity extends Activity {
@Inject
LoginPresenter loginPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
}
public class LoginPresenter {
@Inject
public LoginPresenter() {
}
}
ApplicationComponentからLoginBindingModuleを削除すると、アプリはビルドされますが、実行時例外で失敗します。
Java.lang.IllegalArgumentException:クラスにバインドされたインジェクターファクトリがありません
プロジェクトのセットアップ:
gradle 3.3
buildToolsVersion "25.0.2"
dagger 2.11
annotationProcessor "com.google.dagger:dagger-Android-processor:2.11"
をgradleファイルに追加すると、問題が解決します。
私の場合、SomeModule
クラスには不要な行が含まれていました。
@ContributesAndroidInjector
internal abstract fun fragmentInjector(): SomeFragment
提案された解決策のいずれも機能しない場合は、依存関係のいずれかに@Providesアノテーションを追加するのを忘れたかどうかを確認してください。これは私の場合の問題でした
同じエラーが発生しましたが、問題はDaggerモジュールを宣言したモジュール(プロジェクト)にありました。必ずkotlin-kapt
プラグインを追加してください。追加しないと、Daggerはクラスを生成できません。
// declare it at the top of your build.gradle file
apply plugin: 'kotlin-kapt'
Kotlinの場合、代わりに
annotationProcessor com.google.dagger:dagger-Android-processor:2.11
使用する
kapt com.google.dagger:dagger-Android-processor:2.11
モジュールファイルをKotlinに変換すると、非常に奇妙なエラーが発生しました。それはまれかもしれませんが、おそらく他の誰かが同じ問題に出くわします:
私のDaggerモジュールはGradleモジュールの一部です。 api
Gradle構成のみを持つ依存関係を使用します。 Daggerは、関連するすべてのKotlinクラスに対してスタブ(Java)ファイルを生成します。これらの潜水艦がなければ、すべてが機能しました。これらのスタブでは、上記のエラーが発生しました。不足しているすべての依存関係をGradleモジュールに追加することが、私にとっての解決策でした。