我已经写过这样的布局:

<?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/

10-12 00:24
查看更多