【问题标题】:Kotlin - Two Way Data Binding with 2 EditTextKotlin - 使用 2 EditText 进行双向数据绑定
【发布时间】:2019-10-23 13:22:54
【问题描述】:

我在 kotlin 中尝试了 android 的双向数据绑定,但我似乎无法让它工作。我有 2 个 EditText,每个都应该更新另一个 EditText。

例如: 当我在 EditText1 中输入“Test”时,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)
       }
}

它导致了一个无限循环。我怎样才能防止这种情况发生?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    你需要检查setter的值是否相同,然后不要再次设置:

    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)
           }
    }
    

    【讨论】:

      【解决方案2】:

      您的问题根本与数据出价无关。您的实现会导致对 getter 的递归调用: 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)
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-12-23
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多