使用正确的XML绑定为LiveData变量实现双向数据绑定时出现错误

5

我在登陆界面的activity_login.xml中拥有一个loginViewModel。

<?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"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="loginViewModel"
            type="com.example.test.ui.login.LoginViewModel" />
    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/login_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <EditText
            android:id="@+id/mobile_number"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:editable="true"
            android:ems="10"
            android:hint="@string/mobile_number_string"
            android:inputType="phone"
            android:textAlignment="center"
            android:text="@={loginViewModel.phoneNumber}"
            app:layout_constraintBottom_toTopOf="@+id/otp_input"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

在我的loginViewModel中,我已将我的livedata定义为

class LoginViewModel : ViewModel(){
    private val _phoneNumber = MutableLiveData<String>()
    val phoneNumber : LiveData<String>
        get() = _phoneNumber
}

现在,在构建时我遇到了以下错误。
The expression \u0027loginViewModelPhoneNumber.getValue()\u0027 cannot be inverted, so it cannot be used in a two-way binding\n\nDetails: There is no inverse for method getValue, you must add an @InverseMethod annotation to the method to indicate which method should be used when using it in two-way binding expressions

我正在阅读的所有文章都建议使用这种方法进行实现。 有人能告诉我我在这里做错了什么吗?


2
让您的函数返回MutableLiveData,因为LiveDatasetValue()是私有的。 - Zohaib Amir
4个回答

3

很遗憾,对于双向数据绑定,您需要使用MutableLiveData。

您应该去除_phoneNumber上的私有属性。

然后更改xml以使用它 android:text="@={loginViewModel._phoneNumber}"


2

从...改变

private val _phoneNumber = MutableLiveData<String>()

to

public val _phoneNumber = MutableLiveData<String>()

1
您正在绑定一个LiveData的phoneNumber,它没有任何写入值的接口。
考虑删除phoneNumber,并使用基于Kotlin的方法,只需使用公共属性。

1

代码存在几个问题。

  • 您试图在双向绑定中使用不可变的val phoneNumber,因此它只有getter,绑定类只能从字段读取值,要从UI接收数据-绑定类想要使用setter,但没有设置器,因此phoneNumber将不会更改。

  • 对于绑定phoneNumber的属性,您尝试使用不可变的LiveData - 如果需要更改,则应使用MutableLiveData

  • 如果您希望监听phoneNumber的更改,则需要添加LiveData Observer,如下所示:

phoneNumber.observe{
  val value = it
}

希望它有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接