我刚刚开始使用dagger2。我已经为应用程序级别的依赖关系创建了依赖关系图。现在,我想创建特定活动所需的依赖关系,因此我为活动创建了另一个Component
,然后为该组件创建了模块和范围。现在,当我写完所有代码后,我构建了项目,但出现编译器错误,我无法解决。
这是我在做什么。
@FeedsCatalogActivityScope
@Component(modules = FeedsCatalogActivityModule.class, dependencies = FeederApplicationComponent.class)
//My activity requires Catalog adapter so i am creating dependency for that
public interface FeedsCatalogActivityComponent {
CatalogAdapter getCatalogAdapter();
}
这是模块
@Module
public class FeedsCatalogActivityModule {
private final SelectedInterfaceListener selectedInterfaceListener;
public FeedsCatalogActivityModule(SelectedInterfaceListener selectedInterfaceListener) {
this.selectedInterfaceListener = selectedInterfaceListener;
}
@Provides
@FeedsCatalogActivityScope
public CatalogAdapter catalogAdapter(Picasso picasso, SelectedInterfaceListener mSelectesInterfaceListener) {
return new CatalogAdapter(picasso, mSelectesInterfaceListener);
}
}
这是范围
@Scope
public @interface FeedsCatalogActivityScope {
}
所以现在当我建立我得到这个错误
/用户/ Zeeshan /桌面/个人/Feeder/app/src/main/java/io/droidninja/feeder/FeederApplication.java
错误:(10,31)错误:找不到符号类DaggerFeederApplicationComponent
/用户/ Zeeshan /桌面/个人/Feeder/app/src/main/java/io/droidninja/feeder/ui/activities/FeedsCatalogActivityComponent.java
错误:(13,20)错误:如果没有@Provides注释的方法,则无法提供io.droidninja.feeder.ui.adapters.SelectedInterfaceListener。
io.droidninja.feeder.ui.adapters.SelectedInterfaceListener被注入到
io.droidninja.feeder.ui.activities.FeedsCatalogActivityModule.catalogAdapter(…,mSelectesInterfaceListener)
io.droidninja.feeder.ui.adapters.CatalogAdapter在以下位置提供
io.droidninja.feeder.ui.activities.FeedsCatalogActivityComponent.getCatalogAdapter()
错误:任务':app:compileDebugJavaWithJavac'的执行失败。
编译失败;有关详细信息,请参见编译器错误输出。
我了解的是我在
FeedsCatalogActivityModule
中遇到问题。我应该如何提供SelectedInterfaceListener
?它是一个接口。附言:我是dagger2的新手,我刚开始使用它。
最佳答案
根据您的代码,假设您在使用SelectedInterfaceListener
的活动中构建FeedsCatalogActivityModule
时将其传递给FeedsCatalogActivityComponent
实例。
在您的活动中,创建一个方法来像这样设置组件
private void initializeInjector() {
FeedsCatalogActivityComponent feedsCatalogActivityComponent = DaggerFeedsCatalogActivityComponent.builder()
.feederApplicationComponent(feederApplicationComponent()/* create this method and it should return a correctly built FeederApplicationComponent */ )
.feedsCatalogActivityModule(
new FeedsCatalogActivityModule(
new SelectedInterfaceListener()
/* pass in the instance of SelectedInterfaceListener here */ )
).build();
}
然后记住要更改模块提供的方法
@Provides
@FeedsCatalogActivityScope
public CatalogAdapter catalogAdapter(Picasso picassor) {
return new CatalogAdapter(picasso, this.selectedInterfaceListener);
}