Как правильно инициализировать свойство в 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)
}
}
Протестировал и все заработало.