Android范围自定义,android – 如何在dagger 2.10中创建自定义范围模块

本文探讨了在Android应用中,如何通过将LoginComponent的活动注入逻辑委派给父级组件或在需要时动态检查,以减少代码复杂性和维护成本。介绍了几种不同的策略,包括预先创建、检查活动类型和混合替代方法,以确保正确注入登录相关的组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单子组件作弊

而不是您的应用程序中的正常实现:

public class YourApplication extends Application implements HasActivityInjector {

@Inject DispatchingAndroidInjector dispatchingActivityInjector;

@Override

public AndroidInjector activityInjector() {

return dispatchingActivityInjector; // Always get it from Multibindings.

}

}

只需将活动绑定模块移动到LoginComponent并委托给DispatchingAndroidInjector< Activity>而是从您的LoginComponent:

@Override

public AndroidInjector activityInjector() {

return getOrCreateLoginComponent().getActivityInjector();

}

这是持续维护的最少量,但它似乎相当倒退,因为您正在预先创建LoginComponent.但是,如果LoginComponent很便宜并且是此样式的唯一子组件,那么一切都运行良好:LoginComponent的注入器可以在其父项中看到多重绑定,因此LoginComponent的ActivityInjector将始终对父项中的绑定起作用.

由于非登录活动的绑定仍驻留在ApplicationComponent中,因此这些活动将无法使用父组件的绑定.否则,这无异于将您的LoginComponent合并到您的ApplicationComponent中,这可能不是一个选项,否则您就是这样做的.

委派AndroidInjector

如果您的LoginComponent创建起来很昂贵,那么作为替代方法,您可以在checkof instanceof后面移动getOrCreateLoginComponent()调用:

@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,直到您确定要注入登录相关的活动,这是你如何检查它.上述方法也可以很好地扩展到多个子组件,因为您总是在一个DispatchingAndroidInjector< Activity>上调用注入.来自一个组件.

混合替代品

因为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);

}

}

};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值