Как исправить не удается найти символ view-model-name-BindingImpl при использовании двусторонней привязки данных в Android - PullRequest
0 голосов
/ 24 марта 2019

Я реализую двухстороннее связывание данных с компонентами архитектуры Android, используя LiveData и ViewModel, но при сборке проекта он дает

error: cannot find symbol
import package.[layout_name]BindingImpl;

в DataBinderMapperImpl.java

Я следовал за официальной документацией и искал ответы на SO, но ни у одного из них не было работоспособных решений.

уже пробовал этот один и этот один

layout.xml

    <data>
        <import type="package.ViewModel" /> // this line was added from an answer but didn't work
        <variable
            name="model"
            type="package.ViewModel"/>
    </data>

// an input field I want to bind data with
<androidx.appcompat.widget.AppCompatAutoCompleteTextView
                    android:id="@+id/email"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@={model.email}" // if I remove this line, builds fine
                    android:hint="@string/prompt_email"
                    android:inputType="textEmailAddress"
                    android:maxLines="1"
                    android:singleLine="true" />

Расширение моего ViewModel с AndroidViewModel вместо BaseObservable, как указано в документации

ViewModel.kt

    private val email: MutableLiveData<String> by lazy { MutableLiveData<String>() }
    @Bindable // tried to change the return type to String, still no luck
    fun getEmail(): LiveData<String> {
        return email
    }

    fun setEmail(email: String) {
        this.email.value = email
    }

Вот как я связываю ViewModel с View

Activity.kt

binding.model = ViewModelProviders.of(this, ViewModelProvider.AndroidViewModelFactory
            .getInstance(application))
            .get(LoginViewModel::class.java)

Чего мне не хватает?Уже включены все предварительные привязки данных, и если я заменил ViewModel в layout на data class и попытался получить от него данные, это прекрасно работает, но с @{} в layout

EDIT

Хорошо, поэтому, когда я выставляю email как public, он компилируется и работает привязка, но я не могу сделать его установщик и получатель public, я имею в виду, когдаЯ пытаюсь выставить его из метода получения и установки, IDE говорит, что это уже private fun ctions и не может быть override n?

Как я могу сделать это свойство доступным через fun ctions

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Нашел ответ на Reddit.

Чтобы двусторонняя привязка данных работала, вы должны выставить свои поля, и они должны быть MutableLiveData как

val email = MutableLiveData<String>()

, начиная с kotlinуже имеет свойства get и set, они будут использоваться Binding классами для полей

0 голосов
/ 26 марта 2019

Вы можете использовать метод получения определенной переменной напрямую, используя get() метод для переменной (также работает для сеттера как set(value)) как показано ниже:

@get:Bindable // We make getter method bindable for data-binding
val email = MutableLiveData<String>()
    get() { // Try to provide getter method like this
        return field as LiveData<String>
    }
    set(data) { // Try to provide setter method like this
        if(field.value != data.value) // To avoid infinite loop
            field.value = data.value
    }
...