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

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

Когда я отключаю 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 ответ

Решение

Как обсуждалось в 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)
    }
}

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

Другие вопросы по тегам