要するに、必要な他のモジュールを提供するために、Builderではoverride the call to seedInstance
(インターフェイスではなく抽象クラス)となっています。
edit:確認する前に、実際にそのモジュールを渡す必要があることを確認してください。 Damon added in a separate answerとして、あなたのAndroidクラス用に特定のモジュールを作成している場合は、そのクラスの自動注入を利用して、その時点でグラフから構成またはインスタンスを取り出すことができます。モジュールからコンストラクタパラメータを削除するほうが簡単な場合は、不必要なインスタンスや仮想メソッド呼び出しを避けるため、パフォーマンスが向上する可能性があります。
まず、30秒dagger.android:ではなく、各アクティビティまたはその断片を有するが、その親、活性(またはその断片)について知っているが、HasActivityInjector
のアプリケーション(または親フラグメントをチェックする、AndroidInjection.inject(this)
を呼び出し活動、及びHasFragmentInjector
の申請)。考えられるのは、マルチバインディングにバインディングを提供するということです。寄付されたバインディングはです。常に作成するサブコンポーネントビルダーはビルドオブジェクト固有のサブコンポーネントです。
AndroidInjection.inject(this)
とAndroidInjector.Factory.create(T instance)
からお分かりのように、アクティビティ固有またはフラグメント固有の詳細をBuilderに渡す機会は多くありません。代わりに、サブコンポーネントビルダーがseedInstance
の実装よりも優先されるという考えがあります。
Provides instance
to be used in the binding graph of the built AndroidInjector
. By default, this is used as a BindsInstance
method, but it may be overridden to provide any modules which need a reference to the activity.
This should be the same instance that will be passed to inject(Object)
.
このような何かになりたい::seedInstance
ためのドキュメントのように
@Subcomponent(modules = {OneModule.class, TwoModule.class})
public interface YourActivitySubcomponent extends AndroidInjector<YourActivity> {
// inject(YourActivity) is inherited from AndroidInjector<YourActivity>
@Builder
public abstract class Builder extends AndroidInjector.Builder<YourActivity> {
// Here are your required module builders:
abstract Builder oneModule(OneModule module);
abstract Builder twoModule(TwoModule module);
// By overriding seedInstance, you don't let Dagger provide its
// normal @BindsInstance implementation, but you can supply the
// instance to modules or call your own BindsInstance:
@Override public void seedInstance(YourActivity activity) {
oneModule(new OneModule(activity));
twoModule(new TwoModule(activity.getTwoModuleParameter()));
}
}
}
をここでの仮定は、あなたがモジュールに対してactivity
インスタンスを待つ必要があるということです。ない場合は、サブコンポーネントバインドするとき、あなたはまた、これらの呼び出しのオプションがあります:
@Provides @IntoMap @ActivityKey(YourActivity.class)
AndroidInjector.Factory bindInjector(YourActivitySubcomponent.Builder builder) {
return builder
.oneModule(new OneModule(...))
.twoModule(new TwoModule(...));
}
を...しかし、あなたはそれを行うことができれば、あなたはもっと、簡単にそれらのモジュールをオーバーライドすることによって、それらのバインディングの世話をすることができモジュールのコンストラクタパラメータを提供することができるゼロ引数コンストラクタを実装し、Daggerがパブリックゼロ引数コンストラクタを持つ任意のモジュールに対してそれらを作成させるようにします。
[this](https://android.jlelse.eu/android-and-dagger-2-10-androidinjector-5e9c523679a3)をご覧ください。ほとんどの場合、あなたの質問が解決されます。 – azizbekian
簡単なコードを投稿できますか?どのモジュールを設定できませんか? –