Kotlin注释处理忽略具有相似名称的项目

时间:2016-02-25 17:07:15

标签: android annotations kotlin dagger butterknife

我最近将我的大部分项目转换为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?

提前谢谢! 罗恩

3 个答案:

答案 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,现在该问题被标记为已修复。

This solution was merged

应在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工作了,但后来我将同一个班级重新启用转移到ButterknifeUninitializedPropertyAccessException消失了,似乎它赢了除非课堂上的某些内容发生变化,否则你必须再次重复这个过程。

我怀疑这与Kotlin不支持增量编译有关,并且通过更改自动生成的代码,它被迫重新编译。但我可以离开这里,只是想我分享我的经验。