我已经写过这样的布局:
<?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();
}
}
}
如您在这里看到的,数据绑定编译器使用
vmSomeClassObservableGet
值初始化变量null
,然后不从vmSomeClassObservable
获取它的值。我可以通过在
.get()
上显式调用ObservableField
来解决此问题,但是会导致编译器警告:警告:警告:请勿在ObservasbleFields上显式调用'get()'
在表达中。该支持将很快删除。
'vm.observableField.get()'
我该如何解决这个问题?好像是bug。
最佳答案
您无需使用ObservableField
包装类即可从布局中调用它。
我将用以下内容替换您的字段:
public SomeClass observableField = referenceToSomeClass;
(我将
observableField
重命名为一个更合适的名称,但我这样保留了它,以使答案更清晰)关于android - 可观察变量上的Android DataBinding 3.0.1调用方法会导致生成导致NPE的错误代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47631205/