gpt4 book ai didi

Android DataBinding 3.0.1 对可观察变量的调用方法导致生成导致 NPE 的错误代码

转载 作者:行者123 更新时间:2023-11-29 02:34:55 24 4
gpt4 key购买 nike

我写过这样的布局:

<?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 数据绑定(bind)生成了这样的代码:

// 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();
}
}
}

正如您在这里看到的,数据绑定(bind)编译器使用 null 值初始化变量 vmSomeClassObservableGet,然后不从 vmSomeClassObservable 获取它的值。我可以通过在 ObservableField 上显式调用 .get() 来解决这个问题,但是它会导致编译器警告:

Warning:warning: Do not explicitly call 'get()' on ObservasbleFields in an expression. This support will be removed soon. 'vm.observableField.get()'

我该如何解决这个问题?看起来像错误。

最佳答案

您无需使用 ObservableField 包装类即可从您的布局中调用它。

我会将您的字段替换为:

public SomeClass observableField = referenceToSomeClass;

(我会将 observableField 重命名为更合适的名称,但我保留它是为了让答案更清楚)

关于Android DataBinding 3.0.1 对可观察变量的调用方法导致生成导致 NPE 的错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47631205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com