Как правильно инициализировать свойство в Epoxy ModelView, когда включено сохранение состояния просмотра? - PullRequest
0 голосов
/ 11 января 2019

У меня следующий код для просмотра модели.

Когда я отключаю saveViewState = true или удаляю его, эпоксидный адаптер правильно устанавливает checkbox?.isChecked (в true или false, в соответствии с логическим значением isChecked, которое передается аннотированному методу). Но когда я включаю его (установите saveViewState = true), значение checkbox?.isChecked всегда устанавливается в false (по крайней мере, как я вижу в пользовательском интерфейсе, все флажки сняты).

Я поместил журналы до this.checkbox?.isChecked = isChecked и после, и я увидел, что переданное значение является правильным, и свойство isChecked флажка установлено правильно. Что я не понимаю, так это то, почему эпоксидная система переопределяет все это и устанавливает флажок в непроверенное состояние (в false), несмотря на то, что его свойство установлено, например, в проверенное состояние. Я пытался сделать requestModelBuild на виде эпоксидной смолы сразу после создания моделей и с некоторой задержкой, но это не помогло.

@ModelView(saveViewState = true)
class RowView: ConstraintLayout {
    constructor(context: Context):
        super(context)
    constructor(context: Context, attributeSet: AttributeSet):
        super(context, attributeSet)
    constructor(context: Context, attributeSet: AttributeSet, styleAttr: Int):
        super(context, attributeSet, styleAttr)

    @TextProp
    fun setText(text: CharSequence) {
        this.checkbox?.text = text
    }

    @ModelProp
    fun setCheckedState(isChecked: Boolean) {
        this.checkbox?.isChecked = isChecked
    }

    @CallbackProp
    fun setOnChangeListener(listener: CompoundButton.OnCheckedChangeListener?) {
        listener?.let { this.checkbox?.setOnCheckedChangeListener(it) }
    }
}

Как установить состояние флажка в представлении модели эпоксидной смолы, когда состояние просмотра включено? Эта проблема также происходит при использовании EditText? И почему метка флажка заполнена правильно (пустой текст, переданный текст отображается в порядке)?

1 Ответ

0 голосов
/ 25 февраля 2019

Как обсуждено в https://github.com/airbnb/epoxy/issues/681,, состояния свойств должны храниться в другом месте, и onChangeListener должен запросить перестройку модели в конце. Т.е. «вы не можете иметь данные, предоставленные как сохраненным состоянием, так и опорой модели, поскольку они конфликтуют, сохраненное состояние переопределяет настройки опоры модели».

Чтобы это работало, мне пришлось поменять

@ModelView(saveViewState = true)
class RowView: ConstraintLayout {

до

@ModelView
class RowView: ConstraintLayout {

и реализовать перестройку модели следующим образом

view.rv.buildModelsWith { controller ->
    model.items.forEach { item ->
        RowViewModel_().id(item.id.name)
            .checkedState(model.itemsChosen[item] ?: false)
            .onChangeListener { buttonView, isChecked ->
                if (buttonView.isShown && buttonView.isPressed) {
                    model.itemsChosen[item] = isChecked
                    controller.requestModelBuild()
                }
            }
            .addTo(controller)
    }
}

Протестировал и все заработало.

...