我有以下简单的模块:
@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();
它会在编译时抛出此错误:错误:(22,13)错误:如果没有@ Provide-annotated方法,则无法提供android.content.Context,但是您可以看到它使用@Provides进行注释.
这真的很奇怪,因为当我将限定符注释关闭时,问题消失了.
以防万一,这是我的@ForApplication限定词:
@Qualifier @Retention(RUNTIME) public @interface ForApplication { }
这实际上是一本教材Dagger2的例子.我究竟做错了什么?
解决方法
经过一段时间的尝试和错误,我似乎发现了原因,这是Context的含糊之处,因为在需要Context的某些地方,缺少@ForApplication.
此外,这可能是我对Dagger2的虚弱的理解,但是这个样板很容易出现开发者的错误.
无论如何…对于发现问题的任何人,您只需要在使用依赖关系的每个地方添加限定符注释:
@Singleton @Component( modules = ApplicationModule.class ) public interface ApplicationComponent { CustomApplication getCustomApplication(); @ForApplication Context getApplicationContext(); }