AndroidAnnotations-ViewById不能用于私有元素

AndroidAnnotations-ViewById不能用于私有元素,android,kotlin,android-annotations,Android,Kotlin,Android Annotations,AndroidAnnotations版本:4.3.1 Android编译SDK版本:26 Kotlin版本:1.1.3-2 我正在尝试使用Kotlin和AndroidAnnotations构建应用程序。构建以 Error:Execution failed for task ':app:kaptDebugKotlin'. > Internal compiler error. See log for more details 在androidannotations.log中a是一大堆错误 0

AndroidAnnotations版本:4.3.1

Android编译SDK版本:26

Kotlin版本:1.1.3-2

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

Error:Execution failed for task ':app:kaptDebugKotlin'. > Internal compiler error. See log for more details
在androidannotations.log中a是一大堆错误

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
获取此错误的原因可能是因为备份字段的行为。默认情况下,它不可见,
字段
标识符只能在属性的访问器中使用。这就是为什么在私有元素上不能使用
@ViewById的原因

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

后期初始化的属性也作为字段公开。该字段的可见性将与lateinit属性setter的可见性相同

因此,
@JvmField
是这个问题的另一个解决方案

@ViewById
@JvmField var helloTextView: TextView? = null
它还更改了字段的可见性,如文档所述:

如果需要在Java中将Kotlin属性作为字段公开,则需要使用@JvmField注释对其进行注释。该字段将具有与基础属性相同的可见性。如果属性具有支持字段、非私有、没有open、override或const修饰符,并且不是委托属性,则可以使用@JvmField对其进行注释


您也可以参考这篇文章以及关于使用注释处理的Android框架的文章。

谢谢,非常好。适用于:@ViewById、@Bean、@Prefs、@StringRes、@RootContext。。。所有非基本对象。然而,我仍然认为我的方法也应该有效:
如果没有lateinit,您必须声明一个可为null的类型并添加额外的可为null的检查。
是的,我一开始也这么认为。经过研究,我找到了一个合理的理由。我已经更新了原因的答案。
JVMField
要求最后一个字段。