AndroidAnnotations - ViewById 不能用于私有元素

AndroidAnnotations - ViewById cannot be used on a private element

Android注释版本:4.3.1

Android编译SDK版本:26

科特林版本: 1.1.3-2

我正在尝试使用 Kotlin 和 AndroidAnnotaions 构建应用程序。构建以

结束
Error:Execution failed for task ':app:kaptDebugKotlin'. > Internal compiler error. See log for more details

androidannotations.log 中有很多错误,例如

00:10:43.908 [RMI TCP Connection(91)-127.0.0.1] ERROR o.a.i.p.ModelValidator:77 - org.androidannotations.annotations.ViewById cannot be used on a private element

这就是@ViewById注释的用法

@ViewById
var description: TextView? = null

Pref 注释的变量也会发生同样的情况。

是否还有其他人面临同样的问题,或者只有我遇到?

尝试使用lateinit:

@ViewById
lateinit var description: TextView

出现此错误的原因可能是支持字段的行为。它默认是不可见的,field 标识符只能在 属性 的访问器中使用。这就是为什么你有 @ViewById cannot be used on a private element.

lateinit之所以有效,是因为它改变了字段的可访问性。根据 Kotlin doc:

Late-Initialized properties are also exposed as fields. The visibility of the field will be the same as the visibility of lateinit property setter.

因此,@JvmField 是解决此问题的另一种方法。

@ViewById
@JvmField var helloTextView: TextView? = null

它还更改了字段的可见性,如文档所述:

If you need to expose a Kotlin property as a field in Java, you need to annotate it with the @JvmField annotation. The field will have the same visibility as the underlying property. You can annotate a property with @JvmField if it has a backing field, is not private, does not have open, override or const modifiers, and is not a delegated property.

您还可以参考此 example and Kotlin docs 关于 Android 使用注释处理的框架。