13

次の単純なモジュールがあります。

@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 の例です。私は何を間違っていますか?

4

1 に答える 1

24

かなりの試行錯誤の後、私は原因を見つけたようです。それは、必要な場所で欠落しているContextという曖昧さです。@ForApplicationContext

また、現時点では私の Dagger2 に対する理解が不十分かもしれませんが、このボイラープレートは開発者のエラーを非常に起こしやすいものです。

とにかく...問題を見つけた人は、依存関係が使用されているすべての場所に修飾子の注釈を追加するだけです:

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

    CustomApplication getCustomApplication();

    @ForApplication Context getApplicationContext();

}
于 2015-05-31T00:53:10.637 に答える