首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >匕首-为SubComponent生成器设置动态值

匕首-为SubComponent生成器设置动态值
EN

Stack Overflow用户
提问于 2018-07-26 13:12:40
回答 1查看 1.2K关注 0票数 0

我想在构建它的时候为我的子组件生成器设置一个值。如果是简单的匕首2,我们可以做到以下几点:

代码语言:javascript
复制
@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,子组件及其相关构建器由@ContributesAndroidInjector处理。Dagger Auto生成子组件及其构建器,甚至在当前上下文中实现它。

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

代码语言:javascript
复制
 @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);

    }

我想通过以下方式来建造它:

代码语言:javascript
复制
AndroidInjector.Builder androidInjector = MyApplication
                .getApplication()
                .getAppComponent()
                .getApiEndPoint()
                .getApiEndPointComponent()
                .getUserManager()
                .getUserComponent()
                .getNewEditQuotationComponent().setName("My Name");
        androidInjector.seedInstance(this);
        androidInjector.build();

但没有成功。请让我知道

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-26 20:14:03

dagger.android通过在onCreate中自动创建组件来工作,并且需要以这种方式工作,因为Android允许自己创建活动。预先创建您的AndroidInjector将无法工作;这就是您以前的方法的错误所在。

正如我试图通过重复的问题投票来指出的那样,在@BindsInstance中设置模块实例或dagger.android值的唯一方法是AndroidInjector.Builder,它也充当您的@Subcomponent.Builder。这将允许您从活动实例中提取值,并在活动图中设置它们。

尽管您可以始终将数据存储在@Singleton (ApplicationComponent-作用域)对象或VM全局变量中,但是您正在尝试通过在不设置全局状态的情况下小心地将数据从一个活动传递到另一个活动来做正确的事情。我认为这是正确的方法,但您的解决方案可能不需要显式地构建AndroidInjector。相反,pass your data through the extras bundle是一种将参数和其他数据传输到活动中的惯用方法;然后,您可以将该数据从seedInstance中的活动实例的getIntent().getExtras()中提取出来,从而将数据插入到图形中,因为 runs

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51539720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档