ошибка: com.foo.bar.ChannelsController не является типом фреймворка
Итак, вопрос, на который нужно ответить, "как dagger-android знает, что такое тип фреймворка или нет".
Ответ можно найти в этом коммите для Dagger-Android между 2.19 и 2.20, где они" удалили старый способ работы для лучшей совместимости с AndroidX ".
Итак, как мы можем видеть в https://stackoverflow.com/a/53891780/2413303,
/**
* Returns the Android framework types available to the compiler, keyed by their associated {@code
* dagger.android} {@link MapKey}s. This will always contain the types that are defined by the
* framework, and only contain the support library types if they are on the classpath of the
* current compilation.
*/
static ImmutableMap<Class<? extends Annotation>, TypeMirror> frameworkTypesByMapKey(
Elements elements) {
return ImmutableMap.copyOf(
Stream.of(
elements.getPackageElement("dagger.android"),
elements.getPackageElement("dagger.android.support"))
.filter(packageElement -> packageElement != null)
.flatMap(packageElement -> typesIn(packageElement.getEnclosedElements()).stream())
.filter(AndroidMapKeys::isNotAndroidInjectionKey)
.filter(type -> isAnnotationPresent(type, MapKey.class))
.filter(mapKey -> mapKey.getAnnotation(MapKey.class).unwrapValue())
.flatMap(AndroidMapKeys::classForAnnotationElement)
.collect(toMap(key -> key, key -> mapKeyValue(key, elements))));
}
у них был код, который проверял свои собственные типы @MapKey
в dagger.android
и dagger.android.support
пакеты, которые выглядели так:
// java/dagger/android/support/FragmentKey.java
@Beta
@MapKey
@Documented
@Target(METHOD)
@Deprecated
public @interface FragmentKey {
Class<? extends Fragment> value();
}
Таким образом, они читают типы фреймворков на основе того, что @MapKey
s было доступно в пакетах dagger.android
и dagger.android.support
.
Очевидно, они удалили эту проверку в 2.20, так что теперь вы можете вводить все, что хотите.Радуйтесь!
Но в противном случае вы могли бы взломать его таким образом, что бы вы добавили @ControllerKey
и @ViewKey
in dagger.android
в ваш проект, и он, вероятно, действительно работал бы с2.19.
В этом коммите также удаляются тесты, которые проверяли наличие ошибок в «не типе фреймворка».
Ah и
@Multibinds
abstract Map<String, AndroidInjector.Factory<? extends Controller>> controllerInjectorFactoriesWithStringKeys();
Вы можетеудалите эту часть тоже с 2.20, все что вам нужно сейчас это AndroidInjectionModule
.