Невозможно использовать один и тот же BindingAdapter для двух разных представлений - PullRequest
1 голос
/ 31 января 2020

Я написал пользовательский BindingAdapter , когда при щелчке по значку закрытия на Chip :

@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(onCloseClicked: () -> Unit) {
    setOnCloseIconClickListener { onCloseClicked() }
}

я привязываю его в своем макете следующим образом:

<?xml version="1.0" encoding="utf-8"?>
<layout>

    <data>

        <variable
            name="viewModel"
            type="com.example.playground.MyViewModel" />

    </data>

    <LinearLayout 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"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

            <com.google.android.material.chip.Chip
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="chip 1"
                app:closeIconEnabled="true"
                app:onCloseClicked="@{() -> viewModel.chip1CloseClicked()}" />

            <com.google.android.material.chip.Chip
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="chip 2"
                app:closeIconEnabled="true" />

    </LinearLayout>
</layout>

Когда я связываю только 1 чип (как выше), все работает нормально. Когда я также связываю второй чип, например:

        <com.google.android.material.chip.Chip
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="chip 2"
            app:closeIconEnabled="true"
            app:onCloseClicked="@{() -> viewModel.chip2CloseClicked()}" />

, приложение больше не собирается из-за ошибки привязки данных:

com / example / plays / databinding / ActivityMainBindingImpl. java
ошибка: отсутствует оператор возврата

Любые идеи о том, почему это происходит и как это исправить?

PS: Вы можете попробовать для себя здесь: https://github.com/fmweigl/ChipDatabinding

1 Ответ

2 голосов
/ 02 февраля 2020

Эта проблема уже обсуждалась в этом вопросе - компилятор привязки данных генерирует неверный java код:

// Listener Stub Implementations
// callback impls
public final kotlin.Unit _internalCallbackInvoke(int sourceId ) {
    switch(sourceId) {
        case 1: {
            // localize variables for thread safety
            // viewModel
            com.example.playground.MyViewModel viewModel = mViewModel;
            // viewModel != null
            boolean viewModelJavaLangObjectNull = false;



            viewModelJavaLangObjectNull = (viewModel) != (null);
            if (viewModelJavaLangObjectNull) {


                viewModel.chip1CloseClicked();
            }
            return null;
        }
        case 2: {
            // localize variables for thread safety
            // viewModel
            com.example.playground.MyViewModel viewModel = mViewModel;
            // viewModel != null
            boolean viewModelJavaLangObjectNull = false;



            viewModelJavaLangObjectNull = (viewModel) != (null);
            if (viewModelJavaLangObjectNull) {


                viewModel.chip2CloseClicked();
            }
            return null;
        }
    }
}

Здесь default ветвь с оператором return отсутствует ,

Чтобы решить эту проблему, в вашем случае вы можете изменить сигнатуру функции, отмеченную аннотацией @BindingAdapter, на следующую

@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(clickListener: View.OnClickListener?) {
    setOnCloseIconClickListener(clickListener)
}

После внесения этих изменений проект будет успешно скомпилирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...