Datos Android Encuadernación: Falta la instrucción de retorno en el código generado al llamar adaptador de unión más de una vez personalizada

AaronJ:

Estoy utilizando la biblioteca de enlace de datos y la arquitectura androide MVVM. En el xml Disposición defino una variable llamada modelo de vista del tipo myViewModel. El diseño tiene varias TextInputEditText para el que utilicé el siguiente adaptador de unión de encargo:

//makes the drawable_right of the TextView clickable
@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("onDrawableRightClick")
inline fun TextView.setOnDrawableRightClick(crossinline f: () -> Unit) {
    this.setOnTouchListener(View.OnTouchListener { _, event ->
        if (event.action == MotionEvent.ACTION_UP) {
            if (event.rawX >= this.right - this.paddingRight - this.compoundDrawables[DRAWABLE_RIGHT].bounds.width()) {
                f()
                return@OnTouchListener true
            }
        }
        false
    })
}

En la disposición agrego app:onDrawableRightClick="@{() -> viewModel.doThing()}"a sólo uno de los TextInputEditText y haga clic en Ejecutar. Todo funciona, no hay problema.

Ahora vuelvo y añadir app:onDrawableRightClick="@{() -> viewModel.doOtherThing()}"a la segunda TextInputEditText. Esta compilación falla con el tiempo error: missing return statement.

El error es en MyFragmentBindingImpl (generado), en este bloque de código:

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

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

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

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

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

No hay ni un caso por defecto, ni una instrucción de retorno fuera del conmutador. Esto provoca el error, pero yo estaba bastante seguro de que el caso por defecto no es necesario cuando cada caso es manejado ... De todas formas, cuando vuelva a xml y desmontar uno de los enlaces de escucha, MyFragmentBindingImpl cambia a esto:

public final kotlin.Unit _internalCallbackInvoke(int sourceId ) {
    // localize variables for thread safety
    // viewModel
    com.example.MyViewModel viewModel = mViewModel;
    // viewModel != null
    boolean viewModelJavaLangObjectNull = false;

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

      viewModel.doThing();
    }
    return null;
}

El compilador es feliz de nuevo, pero tengo que usar el adaptador de enlace más de una vez. ¿Cómo puedo hacer que la biblioteca añadir una instrucción de retorno? ¿Hay alguna solución?

Estoy usando Android 3.4 Estudio de vista previa. Gracias a todos

Abraham Mateo:
@SuppressLint("ClickableViewAccessibility")
@BindingAdapter("onDrawableEndClick")
fun setOnDrawableEndClick(view: TextView, listener: OnCompoundDrawableClickListener?) {
    val padding = 10
    if (listener != null) {
        view.setOnTouchListener { _, event ->
            if (event.action == MotionEvent.ACTION_DOWN) {
                if (view.compoundDrawables[DRAWABLE_RIGHT] == null) return@setOnTouchListener false
                else if (event.rawX >= (view.right - view.compoundDrawables[DRAWABLE_RIGHT].bounds.width() - padding)) {
                    listener.onDrawableEnd()
                    return@setOnTouchListener true
                }
            }
            return@setOnTouchListener false
        }
    }
}

intentar algo como esto estoy usando una interfaz personalizada para el oyente (OnCompoundDrawableClickListener)

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=168053&siteId=1
Recomendado
Clasificación