Двухсторонняя ошибка привязки данных для переменной livingata с правильной привязкой xml - PullRequest
1 голос
/ 03 октября 2019

У меня есть loginViewModel для моего входа в Activity, в 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 я определил свои liveata как

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 ]

1 голос
/ 03 октября 2019

изменить с

private val _phoneNumber = MutableLiveData<String>()

на

public val _phoneNumber = MutableLiveData<String>()
0 голосов
/ 03 октября 2019

Есть несколько проблем с кодом.

  • вы пытаетесь использовать val phoneNumber, который не является изменяемым при двустороннем связывании, поэтому имеет только геттер, поэтому класс связывания может только читатьзначение из поля, для получения данных из UI - класс привязки хочет использовать установщик, но его нет, поэтому phoneNumber не изменится.

  • для свойствакоторый связывает phoneNumber, вы пытаетесь использовать LiveData, который не является изменяемым - вы должны использовать MutableLiveData на случай, если вам понадобится его изменить.

  • , если вы хотитепрослушайте изменения phoneNumber, которые нужно добавить LiveData Observer, например

phoneNumber.observe{
  val value = it
}

Надеюсь, это поможет.

0 голосов
/ 03 октября 2019

К сожалению, для двусторонней привязки данных вам нужно использовать MutableLiveData.

Вы должны удалить private на _phoneNumber.

Затем измените xml, чтобы использовать его android:text="@={loginViewModel._phoneNumber}".

0 голосов
/ 03 октября 2019

Вы связываете phoneNumber, который является LiveData, у которого нет интерфейса для записи значения.

Попробуйте удалить phoneNumber и использовать подход, основанный на Kotlin, только с открытым свойством

...