Android Gradle Plugin 3.5.1 数据绑定错误与 Kotiln 通用类型

Dan*_*son 5 android kotlin android-gradle-plugin android-databinding android-studio-3.5.1

我正在尝试对库进行模块化,因此这里可能会发生任何事情。从 Android Gradle 插件 3.5.0 更新到 3.5.1 后,我现在在使用我的 Resource.kt 类的布局上遇到数据绑定错误。我认为该类是直接从 Google Github 浏览器示例中提取的(由于某种原因,我根本无法获得该类的最新提交以进行构建)。该错误似乎特别与通用数据字段有关T

资源.kt

data class Resource<out T>(val status: Status, val data: T?, val message: String?, val throwable: Throwable? = null) {
    companion object {
        fun <T> success(data: T?): Resource<T> {
            return Resource(SUCCESS, data, null)
        }

        fun <T> error(data: T?, msg: String, throwable: Throwable?): Resource<T> {
            return Resource(ERROR, data, msg, throwable)
        }

        fun <T> loading(data: T?): Resource<T> {
            return Resource(LOADING, data, null)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

布局xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <import type="android.view.View" />

        <import type="core.sdk.data.remote.response.Resource" />

        <import type="core.sdk.data.remote.response.Status" />

        <variable
            name="resource"
            type="Resource" />

        <variable
            name="progressText"
            type="String" />
    </data>

    <LinearLayout
        android:id="@+id/circular_progress"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center"
        android:gravity="center"
        android:orientation="vertical"
        app:visibleGone="@{resource.data == null}">

        <androidx.core.widget.ContentLoadingProgressBar
            android:id="@+id/progress_bar"
            style="@style/Widget.AppCompat.ProgressBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:indeterminateTint="@color/ll_secondary"
            android:indeterminateTintMode="src_in"
            app:visibleGone="@{resource.status == Status.LOADING}"
            tools:ignore="UnusedAttribute" />

        <TextView
            android:id="@+id/progress_text_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:text="@{progressText}"
            android:textAppearance="?attr/textAppearanceHeadline5"
            android:textColor="@color/ll_secondary"
            android:textStyle="italic"
            app:visibleGone="@{resource.status == Status.LOADING}"
            tools:text="loading..." />
    </LinearLayout>

</layout>
Run Code Online (Sandbox Code Playgroud)

错误:

LoadingStateBindingImpl.java:106: 错误: ';' 预期的 ?资源数据 = 空; 在此处输入图片说明

我有增量数据绑定和 kapt:

android.databinding.incremental=true
kapt.incremental.apt=true
Run Code Online (Sandbox Code Playgroud)

项目是一个完整的 Kotlin,使用 Kotlin 1.3.50,jvm 目标为 1.8:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

kotlinOptions {
    jvmTarget = "1.8"
}
Run Code Online (Sandbox Code Playgroud)

AGP 3.5.0 不会出现此错误。这是具有 3.5.0 且没有错误的相同文件:

在此处输入图片说明

eny*_*iaa 1

不幸的是,这是数据绑定工作方式的改变,从问题跟踪器的讨论来看,这是一个永久性的改变。

数据绑定引用现在更加严格,因此使用泛型类(在本例中为 Resource)将会失败。类似地使用类似列表的东西:

<variable name="list" type="java.util.List"/>
Run Code Online (Sandbox Code Playgroud)

也会失败。因为数据绑定没有足够的信息来确定泛型类型是什么 - 对泛型有更多了解的人可能能够解释为什么会出现这种情况!

为了处理泛型,数据绑定需要更多信息。有两种方法可以更新数据绑定以使用新的 gradle 插件:

  1. 直接定义您的通用。“<”是相当于“<”的 xml。
<variable name="list" type="java.util.List&lt;MyClass>"/>
Run Code Online (Sandbox Code Playgroud)
  1. 将泛型包装在包含类中。
class MyGenericWrapper : List<Object>  

<variable name="myVariable" type="MyGenericWrapper"/>
Run Code Online (Sandbox Code Playgroud)