2016-05-27 5 views
2

ApplicationComponent.javaDagger2サブコンポーネントモジュールのオーバーライド

@Component(modules = SomeModule.class) 
@ApplicationScope 
public interface ApplicationComponent { 
    // stuff 
    ActivityComponent activityComponent(); 
} 

ActivityComponent.java

@Subcomponent(modules = AnotherModule.class) 
@ActivityScope 
public interface ActivityComponent { 
    // stuff 
    void inject(MainActivity mainActivity); 
} 

SomeModulethisのようなものを使用してオーバーライドすることができます。でも、AnotherModuleはどうですか?

2つのコンポーネントを分離する方法がありますが、親からバインディングを再利用したい場合はどうすればよいですか?

編集:

MainActivity.java

onCreate(Bundle bundle) { 
    getApplicationComponent().getActivityComponent().inject(this); 
} 

EDIT2:

ActivityRyle.java

init() { 
    application.setComponent(DaggerApplicationComponent.builder() 
        .someModule(new TestSomeModule(application)) 
        .build(); 
} 

EDIT3:私は(ここで、メインApplicationに配線あまりにも多くのものを避けるためにしようとしていますコンポーネントが作成されます)。

+0

あなたの質問に関連するすべてを必ず含めてください。外部サンプルにリンクするだけではありません。 –

答えて

0

モジュールをオーバーライドするだけです。あなたはモジュールの引数なしのコンストラクタを持っていない限り、あなたはメソッド宣言のパラメータとしてそれらを配置する必要がありそう

public interface ApplicationComponent { 

    ActivityComponent activityComponent(/*needed modules go here*/); 
} 

あなたがサブコンポーネントを作成方法を、心に留めておいてください。

あなたは引数なしのコンストラクタでモジュールを上書きすることができるようにしたい場合は、あなたのメソッドのシグネチャに追加する必要があると思います:

public interface ApplicationComponent { 

    ActivityComponent activityComponent(AnotherModule module); 
} 

そして、あなたのテストであなたは自分のサブクラスを提供します。

+1

「ActivityComponent」の使用方法をサンプルコードで更新しました。テストでは、どのようにテストモジュールを渡すのですか? 'ApplicationComponent'については、' ActivityTestRule'で行うことができ、コンポーネントを現在のアプリケーションに設定することができます。しかし、私はサブコンポーネントのためにそのようなことをする方法を見つけることができません。 – mbmc

1

サブモジュールファクトリメソッドの入力パラメータとしてモジュールを宣言する必要があります。

+0

どこにテストモジュールを渡すのですか? – mbmc

+0

ActivityComponent activityComponent();の代わりにActivityComponent activityComponent(AnotherModule anotherModule)を書きます。 – EpicPandaForce

+0

はい、私はその部分を取得しますが、テスト内では、アクティビティが使用しているようにテストモジュールをそのコンポーネントに割り当てる方法?メイン 'Application'に' setActivityComponent'を追加しますか? – mbmc

関連する問題