总之,你应该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
你可以发布一些简化的代码吗?你无法设置哪个模块? –