本技能用于指导在 Vaadin 25 中使用数据提供器(Data Providers),适用于 Grid、ComboBox 等列表组件。遇到不确定的 API 细节时,可借助 Vaadin MCP 工具(search_vaadin_docs、get_component_java_api)查询最新文档,并将 vaadin_version 设为 "25"、ui_language 设为 "java"。
主要分两种方式。内存加载适合数百到数千条的小数据集,如 grid.setItems(people),并支持通过 GridListDataView 做筛选与排序,如 dataView.setFilter(...) 与 dataView.setSortOrder(...)。懒加载适合大数据集,仅加载可见部分,筛选排序交给后端。Spring 场景推荐 grid.setItemsPageable(personService::list),服务方法接收 Pageable;仓储方法宜返回 Slice 而非 Page,避免多余的 COUNT 查询,计数交由独立回调处理。非 Spring 场景可用 grid.setItems(query -> ...),回调中通过 getOffset()、getLimit()、getSortOrders() 获取信息。
筛选方面,内存模式用 setFilter,懒加载模式把筛选值传给服务回调,并建议在筛选字段上使用 ValueChangeMode.LAZY 以减少后端调用。排序方面,内存模式可直接对 Comparable 列排序或用 Comparator 自定义;懒加载模式需声明可排序列(如 setSortableColumns("name", "email") 或逐列 setSortable(true)),再处理 sortOrders。ComboBox 也支持懒加载和内置文本筛选。
计数方面,不提供计数回调时 Grid 使用无限滚动;建议提供计数回调以获得正常滚动条,若精确计数开销大可设置估算值。数据更新可调用 refreshItem 刷新单条或 refreshAll 刷新全部;内存列表可用 addItem、removeItem。
实体必须实现基于稳定唯一属性(通常是数据库 ID)的 hashCode 与 equals,ID 字段应为 final,避免可变字段导致 Grid 身份跟踪失效。不要把 Grid 或 DataProvider 交给 Spring 管理,它们持有 UI 状态、绑定单个用户会话,应以普通类创建并通过构造函数注入依赖。此外,建议在实体上定义列名常量以避免字符串拼写错误,筛选条件变化时手动调用 refreshAll(),并避免对懒加载数据调用 getGenericDataView().getItems(),因为这会加载全部数据、破坏懒加载意义。