Возникла проблема с привязкой данных (ошибка: недопустимое начало выражения? ResourceData = null;) - PullRequest
0 голосов
/ 27 октября 2019

Мой XML-код ниже

    <data>

        <import type="android.view.View"/>
        <import type="com.example.data.api.Status" />

        <variable
            name="resource"
            type="com.example.data.api.Resource" />
    </data>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center"
        android:padding="@dimen/dp8"
        android:visibility="@{resource.data == null ? View.GONE : View.VISIBLE}" //This line throwing error
        >

        <ProgressBar
            android:visibility="@{resource.status == Status.LOADING ? View.GONE : View.VISIBLE}"
            style="?android:attr/progressBarStyle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/progress_bar"
            android:layout_margin="8dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/error_msg"
            android:text="@{resource.message ?? @string/unknown_error}"
            android:visibility="@{resource.status == Status.ERROR ? View.GONE : View.VISIBLE}"/>

    </LinearLayout>
</layout>

, используя этот код, я получил ошибку ниже

error: illegal start of expression            ? resourceData = null;

Если я удалю строку ниже, то все работает нормально.

android:visibility="@{resource.data == null ? View.GONE : View.VISIBLE}"

Класс ресурса обрабатывает данные API, которые принимают параметр универсального типа, и он может быть нулевым в любое время. Класс ресурса приведен ниже:

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

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

        fun <T> loading(data: T?): Resource<T> {
            return Resource(Status.LOADING, data, null)
        }
    }
}

Пожалуйста, помогите мне узнать, почему возникла эта ошибка. Что-то не так?

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

У меня была та же проблема, и я мог ее решить, избегая resource.data == null

Вместо этого я создал новый метод в классе Resource, который выполняет сравнение, и, наконец, строка XML выглядит следующим образом: resource.isDataNull

0 голосов
/ 28 октября 2019

Так как ваш класс Resource является универсальным типом, и вы пытаетесь использовать универсальное свойство, вы должны установить тип в XML, в противном случае он показывает illegal start of expression.

<data>
    <import type="android.view.View"/>
    <variable
        name="resource"
        type="com.example.data.api.Resource&lt;String>" />
</data>

Здесь я использовал String как универсальный тип: Resource<String>

...