Свойство Kotlin находится в цикле при получении значения ($ field) - PullRequest
0 голосов
/ 15 января 2019

Когда я связываю значение в свойстве name в xml, геттер, кажется, находится в цикле, и значение внутри него объединяется на экране, пока я не остановлю приложение.

1 - я точно не знаю, нужно ли мне использовать notifyPropertyChanged() или аннотации @set and @get;

2 - Если я установлю get без объединяющей строки, это прекрасно работает: get() = field;

3 - Если я попытаюсь вернуть значение get в фигурных скобках, проблема не исчезнет: get(){return "Field: $field"};

Это модель:

class ContactModel : BaseObservable(){

    @set:Bindable
    @get:Bindable
    var name: String = ""
        get() = "Field: $field"
        set(value) {
            field = value
            notifyPropertyChanged(BR.name)
        }


    @set:Bindable
    @get:Bindable
    var email: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.email)
        }

    @set:Bindable
    @get:Bindable
    var phone: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.phone)
        }

}

Вот активность:

class MainActivity : AppCompatActivity() {


    lateinit var binding: ActivityMainBinding
    var contactModel: ContactModel = ContactModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        contactModel = ContactModel(/*"Rômulo", "romulocoviel@gmail.com", "(19):98421-0821"*/)
        contactModel.name = "Rômulo"
        contactModel.email = "romulocoviel@gmail.com"
        contactModel.phone = "(19):98421-0821"

        binding.contactModel = contactModel
        binding.setLifecycleOwner(this)
    }

    fun changeSignatures(view: View) {
        Log.e("TESTING", "Testando!" + contactModel.name)
        val nameList: ArrayList<ContactModel> = ArrayList()

        contactModel.name = "asdasd"
        contactModel.email = "asdasda"
        contactModel.phone = "asdasd"

    }

}

А вот XML, у меня есть кнопка, которая изменяет значения при касании и виды привязки:

<data>
    <variable
            name="contactModel"
            type="com.example.romulo.bindingmetricsconversor.ContactModel"/>
</data>

<android.support.constraint.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">

    <TextView
            android:text="@={contactModel.name}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tvName" android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="8dp" android:layout_marginStart="8dp"/>
    <TextView
            android:text="@={contactModel.email}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tvEmail" android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/tvName" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="8dp" android:layout_marginStart="8dp"/>
    <TextView
            android:text="@={contactModel.phone}"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/tvPhone" android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/tvEmail" app:layout_constraintStart_toStartOf="parent"
            android:layout_marginLeft="8dp" android:layout_marginStart="8dp"/>
    <Button
            android:text="Change"
            android:layout_width="wrap_content"
            android:layout_height="49dp"
            android:id="@+id/btChange" android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent" android:layout_marginBottom="8dp"
            app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp" android:layout_marginRight="8dp"
            app:layout_constraintStart_toStartOf="parent" android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp" android:onClick="changeSignatures"/>
</android.support.constraint.ConstraintLayout>

Результат на экране всегда таков:

Поле: asdasd

Поле: Поле: asdasd

Поле: Поле: asdasd

Поле: Поле: Поле: asdasd

Поле: Поле: Поле: Поле: asdasd

... в бесконечность

1 Ответ

0 голосов
/ 15 января 2019

Просто ради полноты:

похоже, что всякий раз, когда текстовое представление обновляется слушателем изменения свойства, оно обнаруживает изменение в своем собственном контенте и, таким образом, пытается сохранить его обратно в наблюдаемую область, вызывая цикл, так как вы используете двустороннюю привязку.

Проблема может быть решена путем использования односторонней привязки (@{}), так как при изменении текста текстовое представление будет запускать своих собственных слушателей и пытаться изменить наблюдаемое, отправляя его в бесконечную рекурсию.

...