简而言之,你应该覆盖调用seedInstance https://github.com/google/dagger/blob/master/java/dagger/android/AndroidInjector.java#L79在 Builder(它是一个抽象类而不是接口)上提供您需要的其他模块。
edit:在此之前,请检查并确保您确实需要通过该模块。作为达蒙在单独的答案中添加了 https://stackoverflow.com/a/47487355/1426891,如果您正在为 Android 类创建特定模块,则可以依靠该类的自动注入来从此时的图表中提取配置或实例。如果从模块中消除构造函数参数更容易,那么支持他的方法,这也可以提供更好的性能,因为它们避免了不必要的实例和虚拟方法调用。
First, 30 秒内完成 dagger.android:Activity(或 Fragment)不是让每个 Activity 或 Fragment 了解其父级,而是调用AndroidInjection.inject(this)
,它检查应用程序HasActivityInjector
(或父片段、活动和应用程序HasFragmentInjector
)。这个想法是您为多重绑定创建的绑定提供一个绑定Map<Class, AndroidInjector.Factory>
,其中贡献的绑定是almost您始终编写构建特定于对象的子组件的子组件构建器。
正如你可能会看到的那样AndroidInjection.inject(this)
and AndroidInjector.Factory.create(T instance)
,您没有太多机会将特定于活动或特定于片段的详细信息传递给构建器。相反,这个想法是你的子组件构建器覆盖seedInstance
执行。正如文档中的seedInstance
:
提供instance
用于构建的绑定图中AndroidInjector
。默认情况下,这用作BindsInstance
方法,但它可以被重写以提供需要引用活动的任何模块。
这应该与将传递给的实例相同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(...));
}
...但是如果你能做到这一点,那么你可以通过重写这些模块、实现一个可以提供模块构造函数参数的零参数构造函数,并让 Dagger 创建这些绑定,就像为任何模块一样创建这些绑定。具有公共零参数构造函数的模块。