我刚刚开始使用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);
}

07-24 09:26