Vaadin 14 GridPro组件编辑单元格后UI未同步更新修改值问题
GridPro编辑后UI不同步问题修复方案
核心修复点
- 首先修正
ItemUpdater内的实例获取逻辑:你不需要通过dataProvider.getId(item)额外获取实例,GridPro传入的item参数本身就是ListDataProvider绑定的原实例,额外通过getId获取反而可能因为Item类的getId()实现问题拿到错误实例、甚至是拷贝对象,导致你修改的根本不是UI绑定的条目 - 检查
Item类是否正确实现了equals()和hashCode()方法:ListDataProvider的refreshItem方法依靠这两个方法定位需要刷新的条目,如果两个方法实现不符合预期,会导致refreshItem找不到目标条目,无法触发UI重绘 - 关闭TextRenderer的缓存(Vaadin 23+版本适用):自定义TextRenderer默认会缓存渲染结果,你可以在构造TextRenderer后调用
setCacheable(false)关闭缓存,避免渲染器一直读取旧的缓存值 - 修正后的
ItemUpdater参考代码:
.text(new ItemUpdater<Item, String>() { private static final long serialVersionUID = 1L; @Override public void accept(final Item item, final String newValue) { // 直接修改传入的原实例即可 item.set(prop.getName(), newValue); TableField.this.dataProvider.refreshItem(item); // 如果是外层CustomField绑定的父组件未同步,额外加下面一行,传入最新的列表值 // TableField.this.setValue(TableField.this.dataProvider.getItems()); } })
验证方法
- 你可以在
refreshItem调用后打断点,检查ValueProvider的apply方法是否被触发,如果没有被调用,就说明equals/hashCode实现有问题,或者refreshItem传入的实例不在DataProvider的条目列表里 - 如果
ValueProvider已经返回了新值但UI还是显示旧值,就是TextRenderer的缓存问题,直接关闭缓存即可
内容的提问来源于stack exchange,提问作者Sergiu
相关产品推荐
相关产品推荐

