Vaadin 14 GridPro 元素不反映 UI 中的变化

Vaadin 14 GridPro element does not reflect change in UI

我正在为 CustomField 使用 GridPro 组件。网格由 ListDataProvider 提供支持。网格初始化如下:

this.grid.addEditColumn(new ValueProvider<Item, String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String apply(final Item source) {
        return (String)source.get(prop.getName());
    }
}, new TextRenderer<Item>(new ItemLabelGenerator<Item>() {

    private static final long serialVersionUID = 1L;

    @Override
    public String apply(final Item item) {
        String val = (String)item.get(prop.getName());
        return StringTools.isValidString(val) ? val : "";
    }

})).text(new ItemUpdater<Item, String>() {

    private static final long serialVersionUID = 1L;

    @Override
    public void accept(final Item item, final String newValue) {
        Item dataProviderItem = (Item)dataProvider.getId(item);
    dataProviderItem.set(prop.getName(), newValue);
TableField.this.dataProvider.refreshItem(dataProviderItem);
    }
}).setHeader(prop.getName());

我遇到的问题是,当我编辑一个单元格时,它的内容在 UI 中没有更新,它仍然显示旧值。渲染器正确 returns 新值,ValueProvider 也正确设置新文本值。

你至少以过于复杂的方式设置它。 Java 8 允许您使用这样的几行代码在 GridPro 中设置文本字段。假设你有 Grid<Person>Person#getFirstName returns 的名字和 Person#setFirstName 分别是 setter 和 属性,你只需要这个。不需要调用 DataProvider#refreshItem,因为 GridPro 也会在内部调用。

grid.addEditColumn(Person::getFirstName)
        .text((item, newValue) -> item.setFirstName(newValue))
        .setHeader("First name");

documentation 中查看更多示例。

问题是我用作 GridPro 的类型参数的 POJO 没有不变的 ID,因此 dataProvider.refreshItem 无法在支持集中找到它并更新它。有关详细信息,请参阅 https://vaadin.com/forum/thread/18453090/grid-with-editor-can-t-save-changed-data