不能在两个不同的视图上使用相同的 BindingAdapter
Cannot use same BindingAdapter on two different views
我写了一个自定义 BindingAdapter for when the close icon on a 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/playground/databinding/ActivityMainBindingImpl.java
error: missing return statement
关于为什么会发生这种情况以及如何解决它有什么想法吗?
该问题已在 中讨论 - 数据绑定编译器生成无效的 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;
}
}
}
此处缺少带有 return
语句的 default
分支。
要解决它,在您的情况下,您可以将标有 @BindingAdapter
注释的函数签名更改为下一个
@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(clickListener: View.OnClickListener?) {
setOnCloseIconClickListener(clickListener)
}
应用更改后,项目将成功编译。
我有同样的问题,我通过将 chip1CloseClicked
函数的 return 类型更改为 Void?
和我的绑定适配器来解决它,如下所示:
@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(onCloseClicked: () -> Void) {
setOnCloseIconClickListener { onCloseClicked() }
}
在这种情况下,编译器可以从您的 Kotlin 代码生成正确的 Java 代码。
我写了一个自定义 BindingAdapter for when the close icon on a 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/playground/databinding/ActivityMainBindingImpl.java
error: missing return statement
关于为什么会发生这种情况以及如何解决它有什么想法吗?
该问题已在
// 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;
}
}
}
此处缺少带有 return
语句的 default
分支。
要解决它,在您的情况下,您可以将标有 @BindingAdapter
注释的函数签名更改为下一个
@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(clickListener: View.OnClickListener?) {
setOnCloseIconClickListener(clickListener)
}
应用更改后,项目将成功编译。
我有同样的问题,我通过将 chip1CloseClicked
函数的 return 类型更改为 Void?
和我的绑定适配器来解决它,如下所示:
@BindingAdapter("onCloseClicked")
fun Chip.onCloseClicked(onCloseClicked: () -> Void) {
setOnCloseIconClickListener { onCloseClicked() }
}
在这种情况下,编译器可以从您的 Kotlin 代码生成正确的 Java 代码。