【问题标题】:Dagger - Setting a Dynamic Value to SubComponent Builder [duplicate]Dagger - 为子组件生成器设置动态值
【发布时间】:2018-07-26 13:12:40
【问题描述】:

我想在构建子组件构建器时为其设置一个值。如果是简单的 Dagger 2,我们可以实现如下:

@UserScope
@Subcomponent(modules = {UserModule.class, ActivityBuilder.class, NewEditQuotationModule.class})

public interface UserComponent {
NewEditQuotationComponent.Builder getNewEditQuotationComponent();
void inject(UserManager userManager);

@Subcomponent.Builder
interface Builder {
    @BindsInstance
    Builder user(User user);

    UserComponent build();
}}

但是在 Dagger Android 的情况下,子组件及其关联的构建器由 @ContributesAndroidInjector 处理。 Dagger 自动生成子组件及其构建器,甚至它在当前上下文中的实现。

我想在构建 My Dagger Android 子组件时设置一些值。我尝试了以下方法:

 @Subcomponent(modules = NewEditQuotationModule.class)
    public interface NewEditQuotationComponent extends AndroidInjector<InquiriesEditNewMainActivity> {


    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<InquiriesEditNewMainActivity> {
        @BindsInstance
        public abstract Builder setName(@Named("My_Name") String name);
    }}

        @Module
    public abstract class NewEditQuotationModule {
        @Binds
        @IntoMap
        @ActivityKey(InquiriesEditNewMainActivity.class)
        abstract AndroidInjector.Factory<? extends Activity>
        bindInquiriesEditNewMainActivityInjectorFactory(NewEditQuotationComponent.Builder builder);

    }

我厌倦了通过以下方式构建它:

AndroidInjector.Builder androidInjector = MyApplication
                .getApplication()
                .getAppComponent()
                .getApiEndPoint()
                .getApiEndPointComponent()
                .getUserManager()
                .getUserComponent()
                .getNewEditQuotationComponent().setName("My Name");
        androidInjector.seedInstance(this);
        androidInjector.build();

但没有成功。 请告诉我

  1. 如何在构建组件时设置一些值?
  2. 我在以前的方法中哪里错了?

【问题讨论】:

  • @JeffBowman :我的情况是,某个日期来自以前的活动,当前活动有 5 个片段,它们都需要这些数据。所以我想通过在构建它时将其设置在活动组件中来提供该数据。您建议的方法,我认为行不通。你能帮我解决这个问题吗?

标签: android dependency-injection dagger-2 dagger


【解决方案1】:

dagger.android 通过在onCreate 中自动创建您的组件来工作,并且需要以这种方式工作,因为允许 Android 自己创建您的 Activity。预先创建您的 AndroidInjector 将不起作用;这就是你以前的方法的问题。

正如我试图通过重复问题投票表明的那样,您在 dagger.android 中设置模块实例或 @BindsInstance 值的唯一方法是通过 overriding the seedInstance method in the AndroidInjector.Builder 来充当您的 @Subcomponent.Builder。这将让您从 Activity 实例中提取值并将它们设置在您的 Activity 图表中。

尽管您始终可以将数据存储在@Singleton(ApplicationComponent-scoped)对象或 VM 全局变量中,但您正在尝试通过在不设置全局状态的情况下小心地将数据从 Activity 传递到 Activity 来做正确的事情。 我认为这是正确的方法,而且您的解决方案可能不会涉及显式构建 AndroidInjector。取而代之的是pass your data through the extras bundle,这是一种将参数和其他数据传输到活动中的惯用方式;然后,您可以通过将数据从 seedInstance 中的 Activity 实例上的 getIntent().getExtras() 中拉出,将数据插入图表中,因为 getIntent() should be populated by the time onCreate(Bundle) runs

【讨论】:

  • 你是对的。谢谢它有效。
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-18
相关资源
最近更新 更多