Dagger 2.10 子组件生成器 - 注入器验证失败
Dagger 2.10 subcomponent generator - Injector validation fails
我正在尝试创建一个注释处理器,它将我的 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
工厂模块和子组件文件的结构应该是正确的,因为只要我复制粘贴生成的类并创建一个常规类(工厂模块和子组件)并使用真实的 类 而不是生成的,消息不再显示并且 编译成功
似乎问题出在AndroidMapKeyValidator
(link),其中!MoreTypes.equivalence().equivalent(returnType, intendedReturnType)
调用显然失败了,但我没有太多调试注释处理器的经验,所以我不知道为什么...
也许有人可以帮助在哪里搜索问题?
谢谢
仅供参考: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> {}
}
如果有人对解决方案感兴趣:
我发现由于某种原因,在验证生成的方法时,在项目编译期间比较的 ClassType
-s 的引用不相同。
尽管这些引用指向相同的 class,但在 EqualVisitor.visitDeclared
方法中的 auto-common
库中检查是否相等。显然,这可能是 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
中正确修复相等性检查(我只使用快速修复) .
我正在尝试创建一个注释处理器,它将我的 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
工厂模块和子组件文件的结构应该是正确的,因为只要我复制粘贴生成的类并创建一个常规类(工厂模块和子组件)并使用真实的 类 而不是生成的,消息不再显示并且 编译成功
似乎问题出在AndroidMapKeyValidator
(link),其中!MoreTypes.equivalence().equivalent(returnType, intendedReturnType)
调用显然失败了,但我没有太多调试注释处理器的经验,所以我不知道为什么...
也许有人可以帮助在哪里搜索问题? 谢谢
仅供参考: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> {}
}
如果有人对解决方案感兴趣:
我发现由于某种原因,在验证生成的方法时,在项目编译期间比较的 ClassType
-s 的引用不相同。
尽管这些引用指向相同的 class,但在 EqualVisitor.visitDeclared
方法中的 auto-common
库中检查是否相等。显然,这可能是 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
中正确修复相等性检查(我只使用快速修复) .