启用视图状态保存后,如何在 Epoxy ModelView 中正确初始化 属性?
How do I properly initialize a property in Epoxy ModelView when view state saving is enabled?
我有以下模型视图代码。
当我禁用 saveViewState = true
或删除它时,checkbox?.isChecked
由环氧树脂适配器正确设置(根据传递给注释方法的 isChecked
布尔值设置为 true 或 false) .但是,当我启用它(设置 saveViewState = true
)时,checkbox?.isChecked
值始终设置为 false(至少我在 UI 中看到它时,所有复选框都未选中)。
我在 this.checkbox?.isChecked = isChecked
之前和之后放置了日志,我看到传递的值是正确的,复选框 isChecked
属性 设置正确。我不明白的是,为什么 epoxy 会覆盖所有这些并将复选框设置为未选中状态(为 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 时是否也会出现此问题?以及为什么正确填充了复选框标签(没有空文本,传递的文本按应有的方式显示)?
如 https://github.com/airbnb/epoxy/issues/681 中所述,属性 状态应存储在其他位置,onChangeListener 应在最后请求模型重建。即 "you can't have data provided both by saved state and by a model prop since they conflict, saved state overrides model prop settings".
为了让它起作用,我必须改变
@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)
}
}
测试了它并且有效。
我有以下模型视图代码。
当我禁用 saveViewState = true
或删除它时,checkbox?.isChecked
由环氧树脂适配器正确设置(根据传递给注释方法的 isChecked
布尔值设置为 true 或 false) .但是,当我启用它(设置 saveViewState = true
)时,checkbox?.isChecked
值始终设置为 false(至少我在 UI 中看到它时,所有复选框都未选中)。
我在 this.checkbox?.isChecked = isChecked
之前和之后放置了日志,我看到传递的值是正确的,复选框 isChecked
属性 设置正确。我不明白的是,为什么 epoxy 会覆盖所有这些并将复选框设置为未选中状态(为 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 时是否也会出现此问题?以及为什么正确填充了复选框标签(没有空文本,传递的文本按应有的方式显示)?
如 https://github.com/airbnb/epoxy/issues/681 中所述,属性 状态应存储在其他位置,onChangeListener 应在最后请求模型重建。即 "you can't have data provided both by saved state and by a model prop since they conflict, saved state overrides model prop settings".
为了让它起作用,我必须改变
@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)
}
}
测试了它并且有效。