1

我正在尝试创建一个注释处理器,它将我的 MVP 视图(片段)处理为自动生成的子组件(类似于https://github.com/lukaspili/Auto-Dagger2,但适用于新的Dagger 2.10 android injectors

到目前为止,我已经能够生成适当的文件,但是在编译生成的组件时出现了一个奇怪的错误消息

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链接),其中!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> {} }

4

1 回答 1

1

如果有人对解决方案感兴趣:

我发现由于某种原因,ClassType在项目编译期间比较的 -s 引用在验证生成的方法时并不相同。

这些引用,尽管它们指向同一个类,但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);


我仍然需要检查为什么这些引用不一样,并且我必须考虑如何在repo中提交问题之前 正确修复相等性检查auto-common(我只使用 quickfix) 。auto-common

于 2017-04-12T06:25:10.147 回答