web-dev-qa-db-ja.com

@Providesアノテーション付きメソッドがないとコンテキストを提供できませんが、そうですか?

私は次の簡単なモジュールを持っています:

_@Module
public class ApplicationModule {

    private CustomApplication customApplication;

    public ApplicationModule(CustomApplication customApplication) {
        this.customApplication = customApplication;
    }

    @Provides @Singleton CustomApplication provideCustomApplication() {
        return this.customApplication;
    }

    @Provides @Singleton @ForApplication Context provideApplicationContext() {
        return this.customApplication;
    }

}
_

そして、それぞれの単純なコンポーネント:

_@Singleton
@Component(
        modules = ApplicationModule.class
)
public interface ApplicationComponent {

    CustomApplication getCustomApplication();

    Context getApplicationContext();

}
_

そして、私はここでコンポーネントを作成しています:

_public class CustomApplication extends Application {

    ...

    private ApplicationComponent component;

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        component = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .build();
_

コンパイル時に次のエラーがスローされます:Error:(22, 13) error: Android.content.Context cannot be provided without an @Provides-annotated methodが、ご覧のとおり、_@Provides_のアノテーションが付けられています。

修飾子のアノテーションを外すと問題がなくなるので、本当に奇妙です。

念のため、これは私の_@ForApplication_修飾子です:

_@Qualifier @Retention(RUNTIME)
public @interface ForApplication {
}
_

これは実際には教科書のDagger2の例です。私は何が間違っているのですか?

13
Eduardo Naveda

かなりの試行錯誤の末、原因を突き止めたようですが、それはContextのあいまいさです。なぜなら@ForApplicationは、Contextが必要な場所で欠落しています。

また、現時点ではDagger2についての私の理解が弱いかもしれませんが、この定型文は開発者のエラーを非常に起こしやすいものです。

とにかく...問題を見つけた人は、依存関係が使用されているすべての場所に修飾子アノテーションを追加する必要があります。

@Singleton
@Component(
        modules = ApplicationModule.class
)
public interface ApplicationComponent {

    CustomApplication getCustomApplication();

    @ForApplication Context getApplicationContext();

}
24
Eduardo Naveda