Dagger2 @Named注释问题与RxJava主题

时间:2019-06-20 17:11:56

标签: java android rx-java2 dagger-2

我在Dagger注入错误的BehaviorSubject时遇到问题。声明成员变量时,似乎忽略了我的@Named(“”)注释。我有一个半复杂的任务。我需要一个可以在服务中直接访问的behaviorSubject,放入多个包装对象/接口中,然后再将其注入。

我遇到类似的错误。  java.lang.IllegalStateException:创建对象图时出错:       公共io.reactivex.subjects.PublishSubject所需的io.reactivex.subjects.PublishSubject xxxxx.android.service.xxxx.myBehaviorSubject

当尝试将其注入我的服务时。

@Inject
@Named(NAME)
lateinit var myBehaviorSubject: PublishSubject<MYOBJECT>

第一个示例有效。但是我想在没有成员变量的情况下做到这一点(那么使用dagger的意义是什么。),并且当其他人尝试创建主题注入时,我也不想创建将来的错误。

PublishSubject<MYOBJECT> LPS = null;
@Provides
@Named(NAME)
@Singleton
PublishSubject<MYOBJECT> provideSubjectRx() {
    if(LPS == null){
        LPS =  PublishSubject.create();
    }
    return LPS;
 }

由于某些原因,以下操作无效。无法建立图表。这就是我想要的。

@Provides
@Named(NAME)
@Singleton
PublishSubject<MYOBJECT> provideSubjectRx(PublishSubject<MYOBJECT> LPS) 
{
    if(LPS == null){
        LPS =  PublishSubject.create();
    }
    return LPS;
}

我必须包括这个。

 @Provides
    PublishSubject<MYOBJECT> providePublishSubject() {
        PublishSubject<MYOBJECT> publishSubject = PublishSubject.create();
        return publishSubject;
    }

很奇怪..那就是第一个功能应该做的。好像Dagger出于某种原因不想使用它...现在我得到了发布主题的不同实例,这根本不是我所需要的。 ApiProvider是使用ProvideSubjectRx构建的,然后我的SERVICE提取了WRONG错误的一个,它忽略了我的@named批注,并调用了ProvidePublishSubject

以下版本,但给我的服务提供了错误的版本。

 @Provides
    @Named(NAME)
    @Singleton
    PublishSubject<MYOBJECT> provideSubjectRx(PublishSubject<MYOBJECT> LPS) 
    {
        return LPS;
    }

   @Provides
        PublishSubject<MYOBJECT> providePublishSubject() {
            PublishSubject<MYOBJECT> publishSubject = PublishSubject.create();
            return publishSubject;
        }

我这样构建包装器。

该服务仅注入

@Inject
@Named(NAME)
lateinit var behaviorSubject: PublishSubject<MYOBJECT>

我的包装纸被这样注入

  @Inject
    ApiProvider apiProvider;

并在相同的dagger模块中这样创建。

@Provides
@Singleton
ApiProvider provideApiProvider(
        Context context, 
        @Named(NAME) final PublishSubject<MYOBJECT> subject) {
    return new ApiProvider(context, subject);
}

我唯一能想到的就是我需要使用Dagger构建服务,但这对我的体系结构并不是很好,并且我不拥有该服务。我真的只想注入它。因此,除了创建更多包装对象之外,还有什么事?这似乎很清楚,DI简直太疯狂了。

似乎它认为不能使用正确的构造函数..如果我拿走@name,它仍然无法构建。也许与方法签名中的PublishSubject有关。.据我所知,这应该是如何工作的。好的,我提供如何制作主题,但没有说明为什么它忽略了我的@named

0 个答案:

没有答案