Dagger2 @Name аннотация проблема с темой rxjava - PullRequest
0 голосов
/ 20 июня 2019

У меня проблемы с тем, что Кинжал вводит неправильный объект поведения.Кажется, что он игнорирует мою аннотацию @Named ("") при объявлении члена переменной.У меня полусложная задача.Мне нужен объект ProtectionSubject, к которому непосредственно обращаются в службе, помещают в несколько объектов / интерфейсов-оболочек, которые затем внедряются.

Я получаю сообщения об ошибках типа.java.lang.IllegalStateException: ошибки при создании графа объектов: io.reactivex.subjects.PublishSubject требуется общедоступному io.reactivex.subjects.PublishSubject xxxxx.android.service.xxxx.myBehaviorSubject

При попытке внедрить его мой сервис.

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

Этот первый пример работает.Но я хочу сделать это без переменной-члена (как тогда смысл использовать кинжал ...), и я не хочу создавать будущую ошибку, когда кто-то еще пытается создать предметную инъекцию.

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;
    }

Странно ... это то, что должна делать первая функция.Это похоже на то, что Даггер не хочет использовать его по какой-то причине ... и теперь я получаю разные экземпляры темы публикации, а это совсем не то, что мне нужно.ApiProvider создается с помощью provideSubjectRx, затем мой СЕРВИС извлекает НЕПРАВИЛЬНЫЙ, он игнорирует мою аннотацию с именем @ 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;

и создается так же в этоммодуль кинжала ..

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

Единственное, о чем я могу думать, это то, что мне нужно создать свой сервис с помощью Dagger, но это не очень хорошо для моей архитектуры, и я не являюсь владельцем этого сервиса.Я действительно просто хочу сделать это.Так что, кроме создания еще большего количества объектов-обёрток, что происходит?Это похоже на довольно четкий DI, который сходит с ума.

Просто кажется, что он считает, что правильный конструктор не может быть использован ... если я уберу @ named, он все равно не будет собираться.Может быть, это связано с PublishSubject в сигнатуре метода ... но, насколько я знаю, так оно и должно работать.Что хорошо, я предоставляю, как сделать предмет, это не объясняет, почему он игнорирует мой @ named

...