Kotlin - двухстороннее связывание данных с 2 EditText - PullRequest
0 голосов
/ 23 октября 2019

Я опробовал двухстороннее связывание данных Android в kotlin, но я не могу заставить его работать. У меня есть 2 EditText, и каждый из них должен обновить другой EditText.

Например: когда я ввожу «Test» в EditText1, EditText2 должен обновляться со значением из EditText1 плюс суффикс (e.g. TestSUFFIX) и наоборот.

Это макеты для моего TextViews

<androidx.appcompat.widget.AppCompatEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={convertermodel.valueFrom}" />

<androidx.appcompat.widget.AppCompatEditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@={convertermodel.valueTo}" />

и это мой ViewModel

class ConverterModel : BaseObservable() {

   @Bindable
   var valueFrom: String? = null
       get() {
           return valueTo + "SUFFIX"
       }
       set(param) {
           field = param
           notifyPropertyChanged(BR.valueFrom)
       }

   @Bindable
   var valueTo: String? = null
       get() {
           return valueFrom + "SUFFIX"
       }
       set(param) {
           field = param
           notifyPropertyChanged(BR.valueTo)
       }
}

Это вызывает бесконечный цикл. Как я могу предотвратить это?

Ответы [ 2 ]

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

Вам необходимо проверить значение установщика, если оно совпадает со значением, и не устанавливать его снова:

class ConverterModel : BaseObservable() {

    @Bindable
   var valueFrom: String? = null
       get() {
           return valueTo + "SUFFIX"
       }
       set(param) {
           if (field == param) return
           field = param
           notifyPropertyChanged(BR.valueFrom)
       }

   @Bindable
   var valueTo: String? = null
       get() {
           return valueFrom + "SUFFIX"
       }
       set(param) {
           if (field == param) return
           field = param
           notifyPropertyChanged(BR.valueTo)
       }
}
0 голосов
/ 23 октября 2019

Ваша проблема не связана с привязкой данных вообще. Ваша реализация вызывает рекурсивные вызовы для ваших получателей: valueFrom.get () вызовет valueTo.get () и снова вызовет valueFrom.get () -> StackOverflowError.

Вы должны использовать свойства поддержки kotlin дляпример:

class AccessTest {

    var _valueTo: String? = null
    var _valueFrom: String? = null

    var valueFrom: String? = null
        get() {
            return _valueTo + "SUFFIX"
        }
        set(param) {
            field = param
            _valueFrom = param
        }

    var valueTo: String? = null
        get() {
            return _valueFrom + "SUFFIX"
        }
        set(param) {
            field = param
            _valueTo = param
        }

    @Test
    fun testAccess() {
        valueTo= "valueTo"
        valueFrom= "valueFrom"
        print(valueTo)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...