作者:莪乜子12 | 来源:互联网 | 2023-02-08 12:02
我正在尝试将公司应用程序迁移到dagger 2.10和AndroidInjector.inject
方法,但我认为我发现了一个问题.该应用程序使用自定义范围...就像功能登录有3个活动(每个活动都有自己的匕首模块)和一个LoginModule负责共享只应该在此范围内的单身人士.所以在我用过的第一个Activity中执行类似的操作:
public class LoginActivity extends AppCompatActivity{
public void onCreate(Bundle bla){
LoginActivityComponent activityCompOnent= ((CustomApplication) getApplicationContext())
.plus(new LoginModule()) // generates LoginComponent and save the reference in the CustomApplication
.plus(new LoginActivityModule(this));
activityComponent.inject(this);
...
}
在我刚刚执行的其他活动中 ((CustomApplication) getApplicationContext()).getLoginComponent().plus(new ForgetPasswordModule()).inject(this)
使用AndroidInjector时如何归档相同的行为?
1> Jeff Bowman ..:
单子组件作弊
而不是您的应用程序中的正常实现:
public class YourApplication extends Application implements HasActivityInjector {
@Inject DispatchingAndroidInjector dispatchingActivityInjector;
@Override
public AndroidInjector activityInjector() {
return dispatchingActivityInjector; // Always get it from Multibindings.
}
}
只需将活动绑定模块移动到LoginComponent并委托给DispatchingAndroidInjector
LoginComponent:
@Override
public AndroidInjector activityInjector() {
return getOrCreateLoginComponent().getActivityInjector();
}
这是持续维护的最少量,但它似乎相当倒退,因为您正在预先创建LoginComponent.但是,如果LoginComponent很便宜并且是此样式的唯一子组件,那么一切都运行良好:LoginComponent的注入器可以在其父项中看到多重绑定,因此LoginComponent的ActivityInjector将始终对父项中的绑定起作用.
由于非登录活动的绑定仍驻留在ApplicationComponent中,因此这些活动将无法使用父组件的绑定.否则,这无异于将您的LoginComponent合并到您的ApplicationComponent中,这可能不是一个选项,否则您就是这样做的.
委派AndroidInjector
如果您的LoginComponent创建起来很昂贵,那么作为替代方案,您可以getOrCreateLoginComponent()
在instanceof
支票后面移动调用:
@Inject DispatchingAndroidInjector dispatchingActivityInjector;
@Override
public AndroidInjector activityInjector() {
return new AndroidInjector() {
@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
从一个组件中调用一个.
混合替代品
因为Map存在检查可能非常快,所以您还可以通过先将主注入器检查然后将其投入登录组件来避免该额外列表.当然,如果您拥有该样式的多个子组件,那将开始变得难看.
@Inject DispatchingAndroidInjector dispatchingActivityInjector;
@Override
public AndroidInjector activityInjector() {
return new AndroidInjector() {
@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注射"比宇宙中任何疾病或伤口的疼痛更糟".