You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 19:54:05