【问题标题】:2 way data binding error for a livedata variable with proper xml binding具有正确 xml 绑定的 livedata 变量的 2 路数据绑定错误
【发布时间】:2019-10-03 08:48:54
【问题描述】:

我的登录活动有一个 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

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

【问题讨论】:

  • 让你的函数返回 MutableLiveData,因为 LiveData 的 setValue() 是私有的

标签: android kotlin viewmodel android-livedata


【解决方案1】:

改变

private val _phoneNumber = MutableLiveData<String>()

public val _phoneNumber = MutableLiveData<String>()

【讨论】:

    【解决方案2】:

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

    您应该删除 _phoneNumber 上的私人信息。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        代码有几个问题。

          1234563 ,但不存在 setter,因此 phoneNumber 不会改变。
        • 对于绑定phoneNumber 的属性,您尝试使用不可变的LiveData - 您应该使用MutableLiveData,以防您需要它能够更改。

        • 如果想听phoneNumber的变化需要加LiveDataObserverlike

        phoneNumber.observe{
          val value = it
        }
        

        希望对你有帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-15
          • 1970-01-01
          • 2017-02-13
          • 1970-01-01
          相关资源
          最近更新 更多