我最近将我的大部分项目转换为 kotlin。现在我遇到了几个似乎都与注释库有关的异常错误。不用说,这在 Java 中没有发生。
我将描述这些案例 - 一个在 Dagger 中,一个在 Butterknife 中。
1。
在具有相同名称的不同模型中具有 2 个 @Provides
方法时。
例如在具有“provideFooOrBar”方法的文件“FooProvider.kt”中
@Module
class FooProvider(private val view: FooActivity) {
...
@Provides @FooScope fun provideView() = view
@Provides @FooScope fun provideFooOrBar() = Foo()
}
还有另一个具有相同方法名称的文件“BarProvider.kt”
@Module
class BarProvider(private val view: BarActivity) {
...
@Provides @BarScope fun provideView() = view
@Provides @BarScope fun provideFooOrBar() = Bar()
}
在这种情况下,Dagger 无法生成一些工厂库,并且出现以下编译错误:
Error:(27, 32) error: 找不到符号类 FooProvider_ProvideFooOrBarFactory
可以在 https://github.com/maxandron/DaggerIssue325 找到重现该问题的示例项目
2。
这是使用 Butterknife 时的一个问题。当在两个不同的类中有两个 @Bind
带注释的变量时 - 其中一个在运行时无法初始化而没有任何编译错误!
例如,如果我有:
class FooActivity {
@Bind(R.id.foo) lateinit var mFoo: View
}
class NotFooActivity {
@Bind(R.id.not_foo) lateinit var mFoo: View
}
然后其中一个(或两者?)将无法初始化而没有任何错误。导致访问字段时抛出kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized
异常。
是我在配置 Kotlin 时做错了什么还是 kotlin 错误?
提前感谢您! 罗恩
最佳答案
我遇到了这个问题,所以我开始调查,这是因为 Kapt is only checking the method name比较它们时,and they are added in a set ,因此不允许重复。带注释的字段也是如此,因此目前每个注释可以有一个方法/字段名称。
我在 equals
方法中添加了类名,并且注释现在得到了正确处理,但是测试失败了,我不知道它们是如何工作的,所以我希望有人知道如何解决这个问题.
关于android - Kotlin 注释处理会忽略名称相似的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35633761/