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

Vaadin Flow Grid调用setColumnOrder致getSortOrder列表无限递增问题咨询

Vaadin 14~20 Grid排序规则累加问题规避方案

你定位的问题原因正确,Vaadin 14到20版本的Grid组件setColumnOrder()方法存在内部实现缺陷:其内部调用的updateClientSideSorterIndicators(sortOrder)方法未清空原有排序列表,直接将当前排序规则追加到列表中,每调用一次就会叠加一次排序项,最终导致getSortOrder()和排序事件返回的列表长度异常增长。

可行规避方案

方案1:排序结果去重(无侵入、兼容性最好)

叠加的排序规则均为重复列的重复配置,仅需在处理排序逻辑时按列去重、保留每列最后一个排序规则即可得到正确结果:

// 在sortListener或读取排序状态时添加如下处理
List<GridSortOrder<Car>> rawOrders = grid.getSortOrder();
Map<Grid.Column<Car>, SortDirection> validOrderMap = new LinkedHashMap<>();
// 遍历所有排序项,后出现的同列规则覆盖先出现的
for (GridSortOrder<Car> order : rawOrders) {
    validOrderMap.put(order.getColumn(), order.getDirection());
}
// 转换为可用的排序规则列表
List<GridSortOrder<Car>> validOrders = validOrderMap.entrySet().stream()
        .map(entry -> new GridSortOrder<>(entry.getKey(), entry.getValue()))
        .collect(Collectors.toList());

该方案无需修改现有重置逻辑,不依赖Vaadin内部非公开API,所有受影响版本都可使用。

方案2:调整重置逻辑顺序

修改Reset按钮的执行逻辑,在设置列顺序后先清空现有排序,再重新设置默认排序,直接覆盖setColumnOrder()追加的异常内容:

Button resetButton = new Button("Reset", click -> {
    System.out.println("Reset: " + grid.getSortOrder().size());
    // 先执行列顺序重置
    grid.setColumnOrder(
            grid.getColumnByKey("Name"),
            grid.getColumnByKey("Price"),
            grid.getColumnByKey("Description"));
    // 先清空现有排序,再设置默认规则
    grid.sort(Collections.emptyList());
    defaultSort(grid);
});

该方案实测可完全避免排序规则累加问题,无需额外的后续处理。

方案3:版本升级

该bug已在Vaadin 21.0及更高版本被官方修复,若项目允许升级框架版本,直接升级到Vaadin 21+即可彻底解决该问题,无需额外兼容处理。


内容的提问来源于stack exchange,提问作者Stephane Grenier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:06:03