AndroidAnnotations-无法在私有元素上使用ViewById

kri*_*yna 3 android kotlin android-annotations

AndroidAnnotations版本: 4.3.1

Android compile SDK版本: 26

Kotlin版本: 1.1.3-2

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

Error:Execution failed for task ':app:kaptDebugKotlin'. > Internal compiler error. See log for more details
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

多数民众赞成在@ViewById注释的用法

@ViewById
var description: TextView? = null
Run Code Online (Sandbox Code Playgroud)

对于带有Pref注释的var,也是如此。

还有其他人面临同样的问题吗?还是我自己?

Bak*_*aii 6

尝试使用lateinit

@ViewById
lateinit var description: TextView
Run Code Online (Sandbox Code Playgroud)

出现此错误的原因可能是由于背景字段的行为。默认情况下它是不可见的,并且field标识符只能在属性的访问器中使用。这就是为什么你得到@ViewById cannot be used on a private element

之所以lateinit起作用,是因为它改变了该字段的可访问性。根据Kotlin doc的说法:

后期初始化的属性也显示为字段。该字段的可见性将与lateinit属性设置器的可见性相同。

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

@ViewById
@JvmField var helloTextView: TextView? = null
Run Code Online (Sandbox Code Playgroud)

它还会按照文档说明更改字段的可见性:

如果需要将Kotlin属性公开为Java中的字段,则需要使用@JvmField注释对其进行注释。该字段将具有与基础属性相同的可见性。如果属性具有后备字段,不是私有属性,没有打开,覆盖或const修饰符且不是委派属性,则可以使用@JvmField对其进行注释。

您还可以参考此示例以及有关使用注释处理的Android框架的Kotlin文档