【发布时间】:2018-05-17 18:59:13
【问题描述】:
我写过这样的布局:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable name="vm"
type="example.Vm" />
</data>
<android.support.constraint.ConstraintLayout android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:onClick="@{() -> vm.observableField.buttonClicked()}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
</layout>
在 onClick 参数中,我在 example.Vm 上调用具有此类字段的方法:
public ObservableField<SomeClass> observableField = new ObservableField<>();
Android 数据绑定生成了这样的代码:
// Listener Stub Implementations
// callback impls
public final void _internalCallbackOnClick(int sourceId , android.view.View callbackArg_0) {
// localize variables for thread safety
// vm != null
boolean vmJavaLangObjectNull = false;
// vm.someClassObservable
android.databinding.ObservableField<biz.i20.fire_android.feature.act.SomeClass> vmSomeClassObservable = null;
// vm
biz.i20.fire_android.feature.actscreen.ActVm vm = mVm;
// vm.someClassObservable != null
boolean vmSomeClassObservableJavaLangObjectNull = false;
// vm.someClassObservable.get()
biz.i20.fire_android.feature.act.SomeClass vmSomeClassObservableGet = null;
vmJavaLangObjectNull = (vm) != (null);
if (vmJavaLangObjectNull) {
vmSomeClassObservable = vm.someClassObservable;
vmSomeClassObservableJavaLangObjectNull = (vmSomeClassObservable) != (null);
if (vmSomeClassObservableJavaLangObjectNull) {
vmSomeClassObservableGet.buttonClicked();
}
}
}
正如您在此处看到的,数据绑定编译器使用null 值初始化变量vmSomeClassObservableGet,然后不会从vmSomeClassObservable 获取它的值。
我可以通过在ObservableField 上显式调用.get() 来解决这个问题,但是它会导致编译器警告:
警告:警告:不要在 ObservasbleFields 上显式调用 'get()' 在一个表达式中。此支持将很快被删除。 'vm.observableField.get()'
我该如何解决这个问题?好像是bug。
【问题讨论】:
-
这看起来像一个错误。如果您在表达式中使用“observableField.get()”,您应该只会看到该警告。
标签: android data-binding android-databinding