单子组件作弊
而不是应用程序中的正常实现:
public class YourApplication extends Application implements HasActivityInjector {
@Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector; // Always get it from Multibindings.
}
}
只需将活动绑定模块移至您的 LoginComponent 并委托给DispatchingAndroidInjector<Activity>
从您的 LoginComponent 改为:
@Override
public AndroidInjector<Activity> activityInjector() {
return getOrCreateLoginComponent().getActivityInjector();
}
这是最少的持续维护量,但看起来相当落后,因为您是预先创建 LoginComponent 的。但是,如果 LoginComponent 很便宜并且是这种样式的唯一子组件,那么一切都会完美运行:LoginComponent 的注入器可以看到其父级中的多重绑定,因此 LoginComponent 的 ActivityInjector 始终适用于父级中的绑定。
由于非登录活动的绑定仍然驻留在 ApplicationComponent 中,因此这些活动将无法使用父组件中的绑定。否则,这相当于将您的 LoginComponent 合并到您的 ApplicationComponent 中,这可能不是一个选项,否则您就会这样做。
委托 AndroidInjector
如果您的 LoginComponent 的创建成本很高,那么作为替代方案,您可以移动getOrCreateLoginComponent()
后面打电话instanceof
check:
@Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Override
public AndroidInjector<Activity> activityInjector() {
return new AndroidInjector<Activity>() {
@Override public void inject(Activity activity) {
if (Activity instanceof LoginActivity
|| Activity instanceof OtherLoginActivity) {
getOrCreateLoginComponent().getActivityInjector().inject(activity);
} else {
// You can chain other subcomponents here as well.
dispatchingActivityInjector.inject(activity);
}
}
};
}
这意味着您需要保留一个 LoginComponent 可以处理的活动的单独列表(可能作为 LoginComponent 或 LoginModule 中的字段),但如果您想避免实例化 LoginComponent,直到您确定要注入与登录相关的活动活动,这是您检查它的方法。上述方法也可以很好地扩展到多个子组件,因为您总是调用inject
正好在一个DispatchingAndroidInjector<Activity>
来自恰好一个组件。
混合替代方案
因为地图存在检查可能非常快,所以您还可以通过在将其扔到登录组件之前先检查主注入器来避免额外的列表。当然,如果您有该样式的多个子组件,情况就会开始变得丑陋。
@Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Override
public AndroidInjector<Activity> activityInjector() {
return new AndroidInjector<Activity>() {
@Override public void inject(Activity activity) {
if (!dispatchingActivityInjector.maybeInject(activity)) {
// It's not in the top level. Start checking subcomponents.
getOrCreateLoginComponent().getActivityInjector().inject(activity);
}
}
};
}
希望在这三者之间,您不会发现 Android 注入“比宇宙中已知的任何疾病或伤口所带来的痛苦更糟糕”.