我最近将我的大部分项目转换为kotlin。现在我遇到了一些似乎与注释库有关的异常错误。不用说,它在Java中并没有发生。
我将描述这些案例 - 一个在Dagger,另一个在Butterknife。
1。
在具有相同名称的不同模型中使用2个@Provides
方法时。
例如在文件" FooProvider.kt"有一个" provideFooOrBar"方法
@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: cannot find symbol class 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 bug?
提前谢谢! 罗恩
答案 0 :(得分:3)
我遇到了这个问题,所以我开始进行调查,因为Kapt is only checking the method name在比较and they are added in a set时引起了问题,因此不允许重复。注释字段也是如此,因此目前每个注释可以有一个方法/字段名称。
我在equals
方法中添加了类名,现在正确处理了注释,但是测试破了,我不知道它们是如何工作的,所以我希望有人知道如何解决这个问题。
答案 1 :(得分:1)
事实证明这是kapt的一个错误。 我在Kotlin的bug追踪器上posted an issue,现在该问题被标记为已修复。
应在Kotlin版本1.0.2中解决
答案 2 :(得分:0)
因此,为了回答kotlin.UninitializedPropertyAccessException: lateinit
问题,我在project中遇到了完全相同的问题。我做了什么"解决了这个问题"对我来说是从违规类中删除Butterknife,在这种情况下,它只是我的新可扩展RecyclerView的viewHolder,然后再次运行应用程序。
在将所有@Bind(R.id.my_view_id)
切换到"旧学校"之后运行应用程序findViewById(R.id.my_view_id) as MyViewType
工作了,但后来我将同一个班级重新启用转移到Butterknife
,UninitializedPropertyAccessException
消失了,似乎它赢了除非课堂上的某些内容发生变化,否则你必须再次重复这个过程。
我怀疑这与Kotlin不支持增量编译有关,并且通过更改自动生成的代码,它被迫重新编译。但我可以离开这里,只是想我分享我的经验。