gpt4 book ai didi

android - 如何将 AndroidInjector 与子组件一起使用

转载 作者:搜寻专家 更新时间:2023-11-01 07:45:11 24 4
gpt4 key购买 nike

我想要关注

应用组件

  • subcomponentBlue(modules=ModuleX.class)

  • subcomponentRed (modules=ModuleY.class)

假设我有四个 Activity A、B、C 和 D

如何让 AndroidInjector 工作,这样我就可以拥有

  • A,B有自己的子组件,它们是subcomponentBlue和

  • 的子组件
  • C,D 有自己的子组件,它们是 subcomponentRed 的子组件

最佳答案

虽然没有内置的方法来执行此操作,但您可以通过提供 HasActivityInjector 的实现自行执行此操作在您的应用程序中。您需要重新创建 dagger.android 为您提供的一些细节,但这还不算太糟糕。

引用 DaggerApplication 的默认实现,DispatchingAndroidInjector , 它在其 maybeInject方法只是引用多绑定(bind)构建的 Map<Class, AndroidInjector.Factory>生成 AndroidInjector 并调用 inject .如果您遵循 dagger.android 用户指南,每个 AndroidInjector 恰好是一个子组件,每个 AndroidInjector.Factory 恰好是一个使用 @ContributesAndroidInjector 安装的子组件构建器,但这不是要求。

相反,您的应用程序将包含如下所示的代码:

public class YourApplication extends Application implements HasActivityInjector {
// Let's assume your application component calls inject(this) so these
// @Inject fields are populated, and that you've instantiated some subcomponents
// that are long-lived. Of course, you can inject your Subcomponent.Builder
// interfaces instead, if you want a new subcomponent per activity.
@Inject SubcomponentBlue subcomponentBlue;
@Inject SubcomponentRed subcomponentRed;

@Override public AndroidInjector<Activity> activityInjector() {
// If you can use Java 8 syntax from Android, a lambda would work
// nicely here, as in "return activity -> { ... };".
return new AndroidInjector<Activity>() {
@Override public void inject(Activity activity) {
if (activity instanceof ActivityA) {
// HERE'S THE MAGIC: We know that activity is an ActivityA,
// and that subcomponentBlue has an ActivityA injector, so we
// perform a cast and then use the Builder to create an
// injector that we inject with.
ActivityA aActivity = (ActivityA) activity;
subcomponentBlue.aInjectorBuilder().create(aActivity).inject(aActivity);
} elseif (activity instanceof ActivityB) { // ...
} elseif (activity instanceof ActivityC) {
ActivityC cActivity = (ActivityC) activity;
subcomponentRed.cInjectorBuilder().create(cActivity).inject(cActivity);
} elseif (activity instanceof ActivityD) { // ...
} else {
Exception aTantrum = new IllegalArgumentException("Injector not found");
throw aTantrum;
}
}
};
}
}

以上是有效的,但相当冗长。作为替代方案,而不是使用 @ContributesAndroidInjector ,您可以手动将 Activity 绑定(bind)到多绑定(bind) Map 中,但改为通过子组件访问它们:

@Module public class YourApplicationModule {
@Provides @IntoMap @ActivityKey(ActivityA.class)
static AndroidInjector.Factory<Activity> provideAInjector(
SubcomponentBlue subcomponentBlue) {
// Of course, you can also inject a SubcomponentBlue.Builder and
// create a new one each time.
return subcomponentBlue.aInjectorBuilder();
}

// Same for B, C, and D.
}

必要说明:在所有这些情况下,您都试图访问 A、B、C 和 D 的注入(inject)器,在它们的父子组件“红色”和“蓝色”之外。这意味着您需要使注入(inject)器(子组件构建器)作为“红色”和“蓝色”公共(public) API 的一部分可访问,并弄清楚这些子组件的生命周期是什么样的。他们长寿吗?每个 Activity ?无论哪种方式,这都不是其他开发人员可能期望的生命周期,因此请准备好提供充足的文档。

关于android - 如何将 AndroidInjector 与子组件一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46184303/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com