简体   繁体   English

Dagger 2,如何依赖添加接口

[英]Dagger 2, How to add interface in dependency

I just started working with dagger 2. I have created dependency graph for application level dependency. 我刚开始使用dagger 2.我已经为应用程序级依赖创建了依赖图。 Now that i wanted to create dependency that are required for a specific activity So i created another Component for activity then i created the Module and scope for that component. 现在我想创建特定活动所需的依赖关系所以我为活动创建了另一个Component ,然后我为该组件创建了Module和scope。 Now that when i am done writing all the code i build the project but i get compiler error which i am unable to solve. 现在,当我完成编写所有代码我构建项目,但我得到编译器错误,我无法解决。

Here is what i am doing. 这就是我在做的事情。

@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();
}

Here is the Module 这是模块

@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);
    }

}

Here is the scope 这是范围

    @Scope
public @interface FeedsCatalogActivityScope {
}

So now when i build i get this error 所以现在当我构建我得到这个错误

/Users/Zeeshan/Desktop/personal/Feeder/app/src/main/java/io/droidninja/feeder/FeederApplication.java Error:(10, 31) error: cannot find symbol class DaggerFeederApplicationComponent /Users/Zeeshan/Desktop/personal/Feeder/app/src/main/java/io/droidninja/feeder/ui/activities/FeedsCatalogActivityComponent.java Error:(13, 20) error: io.droidninja.feeder.ui.adapters.SelectedInterfaceListener cannot be provided without an @Provides-annotated method. /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)错误:如果没有@,则无法提供io.droidninja.feeder.ui.adapters.SelectedInterfaceListener提供带注释的方法。 io.droidninja.feeder.ui.adapters.SelectedInterfaceListener is injected at io.droidninja.feeder.ui.activities.FeedsCatalogActivityModule.catalogAdapter(…, mSelectesInterfaceListener) io.droidninja.feeder.ui.adapters.CatalogAdapter is provided at io.droidninja.feeder.ui.activities.FeedsCatalogActivityComponent.getCatalogAdapter() Error:Execution failed for task ':app:compileDebugJavaWithJavac'. 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'的执行失败。 Compilation failed; 编译失败; see the compiler error output for details. 请参阅编译器错误输出以获取详细信

What i am understanding is that i have problem in FeedsCatalogActivityModule . 我的理解是我在FeedsCatalogActivityModuleFeedsCatalogActivityModule问题。 How should i provide SelectedInterfaceListener ? 我应该如何提供SelectedInterfaceListener It is a interface. 这是一个界面。

PS i am new to dagger2 i just get started with it. PS我是dagger2的新手,我刚刚开始使用它。

Well, you must somehow provide an implementation for that interface. 好吧,你必须以某种方式为该接口提供实现。 Take a look at: 看一眼:

Example

@Binds
abstract SelectedInterfaceListener provideDsListPresenter(SelectedInterfaceListenerImpl impl);

According to your code, you are suppose to pass an instance of SelectedInterfaceListener to FeedsCatalogActivityModule when your are building FeedsCatalogActivityComponent inside the activity that uses it. 根据您的代码,当您在使用它的活动内部构建FeedsCatalogActivityComponent时,您应该将SelectedInterfaceListener的实例传递给FeedsCatalogActivityModule

in your activity create a method that setup the component like this 在您的活动中创建一个方法来设置这样的组件

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(); 
}

And then remember to change the Module provides method to 然后记得改变Module提供的方法

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM