Dagger 2,如何在依赖项中添加接口

时间:2017-02-18 07:38:57

标签: java android android-studio dependency-injection dagger-2

我刚开始使用dagger 2.我已经为应用程序级依赖创建了依赖图。现在我想创建特定活动所需的依赖项所以我为活动创建了另一个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 {
}

所以现在当我构建我得到这个错误

  

/Users/Zeeshan/Desktop/personal/Feeder/app/src/main/java/io/droidninja/feeder/FeederApplication.java   错误:(10,31)错误:找不到符号类DaggerFeederApplicationComponent   /Users/Zeeshan/Desktop/personal/Feeder/app/src/main/java/io/droidninja/feeder/ui/activities/FeedsCatalogActivityComponent.java   错误:(13,20)错误:如果没有@ Provide-annotated方法,则无法提供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?这是一个界面。

P.S我是dagger2的新手,我刚刚开始使用它。

2 个答案:

答案 0 :(得分:0)

好吧,你必须以某种方式提供该接口的实现。看看:

示例

@Binds
abstract SelectedInterfaceListener provideDsListPresenter(SelectedInterfaceListenerImpl impl);

答案 1 :(得分:0)

根据您的代码,当您在使用它的活动中构建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(); 
}

然后记得将Module提供的方法更改为

@Provides
@FeedsCatalogActivityScope
public CatalogAdapter catalogAdapter(Picasso picassor) {
    return new CatalogAdapter(picasso, this.selectedInterfaceListener);
}