3

我的登录活动有一个 loginViewModel,在 activity_login.xml

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

我正在阅读的所有文章都建议以这种方式实施。有人可以告诉我我在这里做错了什么吗?

4

4 回答 4

2

不幸的是,对于双向数据绑定,您需要使用 MutableLiveData。

您应该删除 private on _phoneNumber

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

于 2019-10-03T11:03:04.117 回答
2

从改变

private val _phoneNumber = MutableLiveData<String>()

public val _phoneNumber = MutableLiveData<String>()
于 2019-10-03T09:09:16.577 回答
1

您正在绑定phoneNumber它是一个 LiveData,它没有任何用于写入值的接口。

考虑删除phoneNumber,并使用基于 Kotlin 的方法,仅使用公共属性

于 2019-10-03T09:14:00.117 回答
1

代码有几个问题。

  • 您尝试使用val phoneNumber不可变的两种方式绑定,因此只有 getter,因此绑定类只能从字段中读取值,以从 UI 接收数据 - 绑定类想要使用 setter,但不存在 setter,因此phoneNumber不会改变。

  • 对于绑定phoneNumber您尝试使用LiveData的不可变的属性 - 您应该使用MutableLiveData它以防万一您需要它能够更改。

  • 如果你想听phoneNumber你需要添加LiveData Observer喜欢的变化

phoneNumber.observe{
  val value = it
}

希望能帮助到你。

于 2019-10-03T14:45:16.590 回答