Генератор субкомпонентов Dagger 2.10 - Проверка инжектора не удалась
Я пытаюсь создать процессор аннотаций, который будет обрабатывать мои MVP-представления (фрагменты) для автоматически сгенерированных субкомпонентов (аналогично https://github.com/lukaspili/Auto-Dagger2, но для новых инжекторов Dagger 2.10 для Android)
До сих пор я был в состоянии генерировать соответствующие файлы, но при компиляции сгенерированных компонентов появляется странное сообщение об ошибке
Error:(22, 58) error: @dagger.android.support.FragmentKey methods should bind dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>, not dagger.android.AndroidInjector.Factory<? extends android.support.v4.app.Fragment>. See google.github.io/dagger/android
Структура модуля Factory и файлов Subcomponent должна быть правильной, потому что, как только я копирую и вставляю сгенерированные классы и создаю обычные классы (и модуль Factory, и Subcomponent) и использую реальные классы вместо сгенерированных, сообщение больше не отображается и компиляция удалась
Кажется, проблема заключается в AndroidMapKeyValidator
( ссылка), где !MoreTypes.equivalence().equivalent(returnType, intendedReturnType)
вызов, очевидно, не удается, но у меня нет большого опыта отладки процессоров аннотаций, поэтому я не знаю, почему именно...
Может кто-нибудь помочь, где искать проблему? Спасибо
FYI: MyFragment
действительно распространяется android.support.v4.app.Fragment
Мои файлы:
Созданная Фабрика
@Module
public interface BuildersModule {
@Binds
@IntoMap
@FragmentKey(MyFragment.class)
abstract AndroidInjector.Factory<? extends Fragment> factory(MySubcomponent.Builder builder);
}
Сгенерированный подкомпонент
@Subcomponent(modules = MyModule.class)
public interface MySubcomponent extends AndroidInjector<MyFragment> {
MyPresenter presenter();
@Subcomponent.Builder
abstract class Builder extends AndroidInjector.Builder<MyFragment> {}
}
1 ответ
Если кто-то заинтересован в решении:
Я узнал, что по какой-то причине ClassType
-сравниваются во время компиляции проекта не совпадают при проверке сгенерированного метода.
И эти ссылки, несмотря на то, что они указывают на один и тот же класс, проверяются на равенство в auto-common
библиотека в EqualVisitor.visitDeclared
метод. Видимо, это может быть ошибка в auto-common
, потому что элементы в visitDeclared
сравниваются по ссылке на объект, но не по типу.
Поэтому обходной путь здесь заключается в использовании локальной фиксированной копии auto-common
библиотека и исключить все зависимости исходной библиотеки.
//TODO think if this is the correct solution to cast both elements
//return aElement.equals(bElement)
return ((TypeElement) aElement).getQualifiedName().equals(((TypeElement) bElement).getQualifiedName())
&& equal(a.getEnclosingType(), b.getEnclosingType(), newVisiting)
&& equalLists(a.getTypeArguments(), b.getTypeArguments(), newVisiting);
Я все еще должен проверить, почему эти ссылки не совпадают, и я должен подумать, как правильно установить проверку на равенство в
auto-common
(Я использую только быстрое исправление), прежде чем подавать проблему в auto-common
Сделки РЕПО.