總之,你應該override the call to seedInstance
在Builder(這是一個抽象類,而不是一個接口),提供您所需要的其他模塊。
編輯:在此之前,檢查並確保您確實需要通過該模塊。由於Damon added in a separate answer,如果您爲Android類創建了特定的模塊,您可以依靠該類的自動注入來將配置或實例從該圖上拉出。如果僅僅從模塊中消除構造函數參數更容易,也可以提供更好的性能,因爲它們避免了不必要的實例和虛方法調用。
首先,dagger.android在30秒:而不是具有各活動或片段知道它的父,活動(或片段)調用AndroidInjection.inject(this)
,其檢查HasActivityInjector
(或父片段的應用,活動和申請HasFragmentInjector
)。這個想法是,你貢獻了一個綁定到一個multibindings創建Map<Class, AndroidInjector.Factory>
,其中貢獻綁定幾乎你寫的構建特定對象的子始終子建設者。
正如你可能從AndroidInjection.inject(this)
和AndroidInjector.Factory.create(T instance)
告訴,你沒有得到很多的機會,通過特定活動或特定片段,向您詳細介紹構建的。取而代之的是,這個想法是,你的子組件構建覆蓋seedInstance
實施。如在文檔的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)
.
那會是這個樣子:
@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(...));
}
...但如果你能做到這一點,那麼你可以更輕鬆地通過重寫這些模塊照顧那些綁定,實現可供給模塊的構造函數參數零參數的構造函數,並讓匕首創造者,因爲它確實爲公共零參數構造的任何模塊。
參見[這](https://android.jlelse.eu/android-and-dagger-2-10-androidinjector-5e9c523679a3),最有可能會解決你的問題。 – azizbekian
你可以發佈一些簡化的代碼嗎?你無法設置哪個模塊? –