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
相关产品推荐
相关产品推荐

