2017-02-18 43 views
1

我刚开始使用匕首2.我已经为应用程序级依赖项创建了依赖关系图。现在我想创建特定活动所需的依赖关系所以我为活动创建了另一个Component,然后我为该组件创建了模块和作用域。现在,当我完成编写所有的代码,我生成的项目,但我得到编译器错误,我无法解决。匕首2,如何在依赖项中添加接口

这是我在做什么。

@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 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. 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'. Compilation failed; see the compiler error output for details.

什么,我的理解是我在有问题。我应该如何提供SelectedInterfaceListener?它是一个接口。

P.S我是新来的匕首我刚开始使用它。

回答

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

,然后针对组件记得要改变模块提供的方法来

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

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

@Binds 
abstract SelectedInterfaceListener provideDsListPresenter(SelectedInterfaceListenerImpl impl); 
+0

活动是实现该接口。我应该怎么做呢? –

+0

https://guides.codepath.com/android/Dependency-Injection-with-Dagger-2#dependent-components-vs-subcomponents – TmTron

+0

@ZeeshanShabbir不知道为什么你希望它通过一个Activity来实现,无论如何检查我的在构建组件时回答并传递'this'作为模块构造函数中的引用。 – Distjoy