2016-08-16 6 views
5

私はフラグメントとプレゼンターにシングルトンを注入するApplicationComponentを持っていますが、AppComponentと同じプレゼンターに注入するコンポーネントを作成しようとしていますそうです。これらの線に沿って何か。Dagger 2を使用して複数のコンポーネントを同じオブジェクトに挿入する方法

@Component{modules = FileManagerModule.class} 
public interface FileManagerComponet 
{ 
    public void inject(MyPresenter presenter); 
} 

@Component{modules = AppModule.class} 
public interface AppComponent 
{ 
    public void inject(MyPresenter presenter); 
} 

@Module 
public class AppModule 
{ 
    private Context appContext; 
    @Provides 
    @Singleton 
    public SharedPreferences preferences() 
    { 
     return appContext.sharedPreferences(); 
    } 
    ... 
} 

@Module 
public class FileManagerModule 
{ 
    private Context activityContext; 
    @Provides 
    public FileManager FileManager() 
    { 
     return new FileManager(activityContext); 
    } 
    ... 
} 
+2

この質問は、複数回入力する必要があります。コンポーネントはフィールドの_all_を指定する必要があります。そうでないと機能しません。コンポーネントを組み合わせて一致させることはできません。例えばここで確認してください:http://stackoverflow.com/a/38897722/1837367 –

+0

@DavidMedenjak次に、アプリケーションが作成され、アクティビティコンテキストがないときにAppComponentがビルドされている場合、FileManagerModuleにアクティビティコンテキストを与えることはできますか? – Stampede10343

答えて

6

これを理解できない人にとっては、1つのコンポーネントがすべての依存関係をオブジェクトに提供する必要があります。だから、私の場合、私はFileComponentをサブコンポーネントにして、私のAppComponentに「.plus()」とするか、それをAppComponentに依存させてAppComponentにコンテキストを下流に公開する必要があります。Context context();それに依存するコンポーネントそれが持っている文脈にアクセスすることができます。例えば

@Singleton 
@Component(modules = {NetworkModule.class, AndroidModule.class}) 
public interface ApplicationComponent { 
    FileManagerComponent plus(FileManagerModule module); 
} 

@Subcomponent(modules = {FileManagerModule.class}) 
public interface FileManagerComponent { 
    void injectMyActivity(MyFileManagingActivity activity); 
} 

そして、あなたは(MyFileManagingActivityで)このようにそれを使用します。

FileManagerComponent fmc = applicationComponent.plus(new FileManagerModule()); 
fmc.injectMyActivity(this); 

それとも、このようなサブコンポーネントのものを使用しない場合

@Singleton 
@Component(modules = {NetworkModule.class, AndroidModule.class}) 
public interface ApplicationComponent { 
    Context context(); 
    File applicationRootDirectory(); 
} 

// Notice this is ALSO a Component 
@Component(modules = {FileManagerModule.class}, dependencies = ApplicationComponent.class) 
public interface FileManagerComponent { 
    void inject(MyFileManagerActivity activity); 
} 

これで、アプリケーションコンポーネントに依存するコンポーネントをビルドする必要があります。

​​
+2

いくつかのコードを追加してください –

+0

ここにコードを追加できたらうれしいでしょう。サブコンポーネントの公式な文書や例は理解しにくいので –

関連する問題