Подтвердить что ты не робот

Ошибка при загрузке в стиле Dagger 2 Generic Type

Я не могу позволить MyClass вводить его из-за его общей природы.

Кинжал жалуется на эту ошибку:

Ошибка: (187, 10) error: com.test.MyClass имеет параметры типа, не могут ли члены вводить исходный тип. с помощью: com.test.MyComponent.inject(com.test.MyClass obj) [метод вставки компонентов для типа: com.test.MyClass]

Я немного искал Google, но не смог найти решение для этого сценария.

class MyClass<Type> {
    @Inject
    UserCredentials userCredentials;

    ResultProducer<Type> mRP;

    public MyClass(ResultProducer<Type> resultProd) {
        mRP = resultProd;
        Injector.getComponent().inject(this);
    }

    public Type getResult() {
        if (userCredentials.isLoggedIn()) {
            mRP.get();
        } else {
            mRP.getAnonymousCache();
        }
    }
}

@Component(modules = CredentialsModule.class )
interface MyComponent {
    void inject(MyClass obj);
}

@Module
class CredentialsModule {
    @Provides
    public UserCredentials provideUserCredentials() {
        return new UserCredentials();
    }
}
4b9b3361

Ответ 1

Я столкнулся с той же проблемой и нашел эту статью.

В двух словах у вас есть следующие опции:

  • Сделать не общий класс-оболочку, содержащий введенные поля, сделать его полем вашего класса и ввести его вместо самого общего класса.
  • Внедрить дочерний не общий класс вместо базового класса. Все аннотированные полями @Inject базового класса также будут введены, но они должны быть общедоступными/защищенными, что не очень хорошо.
  • Сделать аннотирование с помощью @Inject setter в базовом классе и в частном поле. Внедрение дочернего не общего класса приведет к запуску сеттера с параметром, полученным из графа объектов.

Ответ 2

Многим будет полезно знать, что он позволяет вводить поля в общий класс, не вводя сам класс.
Он будет введен для вас, когда будет введен подкласс.
Таким образом, вы можете иметь:

abstract class MyClass<? extends Something> {
    @Inject UserCredentials userCredentials;
    // you can use it further
}

class AnotherClass extends MyClass<Whatever> {
    // just inject this one
}

Ответ 3

Вы можете использовать dagger2 без "инъекции".

Добавьте метод к вашему компоненту:

@Component(modules = CredentialsModule.class )
interface MyComponent {
void inject(MyClass obj);

UserCredentials getUserCredentials();
}

И используйте его без проблем:

userCredentials=Injector.getComponent().getUserCredentials();

Но этот подход может быть неудобным, если у вас есть много полей для ввода