簡體   English   中英

Dagger 2,如何依賴添加接口

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

我剛開始使用dagger 2.我已經為應用程序級依賴創建了依賴圖。 現在我想創建特定活動所需的依賴關系所以我為活動創建了另一個Component ,然后我為該組件創建了Module和scope。 現在,當我完成編寫所有代碼我構建項目,但我得到編譯器錯誤,我無法解決。

這就是我在做的事情。

@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)錯誤:如果沒有@,則無法提供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'的執行失敗。 編譯失敗; 請參閱編譯器錯誤輸出以獲取詳細信

我的理解是我在FeedsCatalogActivityModuleFeedsCatalogActivityModule問題。 我應該如何提供SelectedInterfaceListener 這是一個界面。

PS我是dagger2的新手,我剛剛開始使用它。

好吧,你必須以某種方式為該接口提供實現。 看一眼:

@Binds
abstract SelectedInterfaceListener provideDsListPresenter(SelectedInterfaceListenerImpl impl);

根據您的代碼,當您在使用它的活動內部構建FeedsCatalogActivityComponent時,您應該將SelectedInterfaceListener的實例傳遞給FeedsCatalogActivityModule

在您的活動中創建一個方法來設置這樣的組件

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM