Kotlin:使用 Observables 更新 UI 的未解决参考

Kotlin: unresolved reference for Updating UI using Observables

我正在学习 android 的 kotlin 和数据绑定。我能够 运行 数据绑定功能。当我使用 Observable 时,我得到了 BR.property

的未解析引用

这是我的model class

data class FruitModel(var fruitImage: String?, var fruitName: String?) : BaseObservable() {


var imageUrl: String? = fruitImage
    get() = field
    set(value) {
        field = value
        notifyPropertyChanged(BR.imageUrl)
    }

var nameValue: String? = fruitName
    get() = field
    set(value) {
        field = value
        notifyPropertyChanged(BR.fruitModel)
    }

}

我能够得到 BR.fruitModel 而不是以上两个。这是我的 xml:

<data>

    <variable name="onClickItem"
              type="com.wings.kotlintest1.interfaces.FruitAdapterInterface"/>

    <variable name="fruitModel"
              type="com.wings.kotlintest1.model.FruitModel"/>

    <variable name="position"
              type="int"/>

</data>

<LinearLayout android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:orientation="vertical">

    <androidx.cardview.widget.CardView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="5dp"
            card_view:cardCornerRadius="5dp"
            android:onClick="@{() -> onClickItem.onClickItemListener(position)}">

        <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal">

            <ImageView
                    android:id="@+id/ivFruitImage"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    app:loadImageWithGlide="@{fruitModel.fruitImage}"/>

            <TextView
                    android:id="@+id/tvFruitName"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginStart="10dp"
                    android:gravity="center_vertical"
                    android:textColor="@color/colorAccent"
                    android:textSize="18sp"
                    android:text="@{fruitModel.fruitName}"/>


        </LinearLayout>


    </androidx.cardview.widget.CardView>


</LinearLayout>

what is reason that BR class is not generating properties? Am I doing something wrong?

您的完整布局必须在 <layout> ... </layout> 内。 另外,尝试清理和构建您的项目。 您还可以在构建 window.

下的堆栈跟踪中跟踪您的错误行

我认为您需要将 @Bindable 属性 添加到这些字段的 get() 中。看 https://developer.android.com/topic/libraries/data-binding/observability

我认为你需要使用 @get:Bindable

data class FruitModel(var fruitImage: String?, var fruitName: String?) : BaseObservable() {

    @get:Bindable
    var imageUrl: String? = fruitImage
        get() = field
        set(value) {
            field = value
            notifyPropertyChanged(BR.imageUrl) // **unresolved reference : BR.imageUrl**
        }

    @get:Bindable
    var nameValue: String? = fruitName
        get() = field
        set(value) {
            field = value
            notifyPropertyChanged(BR.nameValue) // **unresolved reference : BR.nameValue**
        }
}