2017-02-18 10 views
1

ダガー2で作業を開始しました。アプリケーションレベルの依存関係の依存グラフを作成しました。今私は特定のアクティビティに必要な依存関係を作成したいので、別のアクティビティ用にComponentを作成して、そのコンポーネントのモジュールとスコープを作成しました。今、私はすべてのコードを書くことが終わったときにプロジェクトをビルドしますが、私は解決できないコンパイラエラーが発生します。ダガー2、インターフェイスを依存関係に追加する方法

ここは私がやっていることです。私は

/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.

は理解がどのような私はある、このエラーを取得するビルド時にここで

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

は、だから今スコープ

@Scope 
public @interface FeedsCatalogActivityScope { 
} 

モジュールここ

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

} 

されています私はに問題がある。 SelectedInterfaceListenerをどうすればいいですか?それはインターフェイスです。

P.S私はdagger2の新機能です。ちょうどそれを使い始めました。

答えて

0

を、あなたはFeedsCatalogActivityModuleSelectedInterfaceListenerのインスタンスを渡すために仮定されていますあなたがいるときそれを使用するアクティビティ内に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はなぜそれがアクティビティによって実装されたがっているのだろうと思っています。コンポーネントをビルドするときに、モジュールコンストラクタ内の参照として 'this 'を渡してください。 – Distjoy

関連する問題