Flutter SfDataGrid排序仅渲染行但数据源未同步问题求助
SfDataGrid排序时同步更新原始数据源的解决方案
SfDataGrid默认内置排序仅对DataGridRow集合做排序处理,不会改动你维护的_entities原始数据源,所以你获取单元格值时拿到的还是排序前的原始数据。要实现界面和数据源同步排序,需要在排序触发时手动对_entities进行排序,再重新生成DataGridRow。
1. 开启SfDataGrid的排序功能
首先把SfDataGrid的allowSorting设为true,如果需要多列排序就开启对应配置:
SfDataGrid( // ... 其他原有属性 allowSorting: true, // 从false改为true allowMultiColumnSorting: true, // 根据业务需求选择是否开启 // ... 其他原有属性 )
2. 在PortfolioDataSource中重写handleSorting方法
在你的PortfolioDataSource类中,重写handleSorting方法,在排序触发时直接对_entities数据源应用排序规则,再重新构建DataGridRow并通知组件刷新:
@override void handleSorting(List<SortColumnDetails> sortColumns) { // 按照排序规则对原始数据源_entities进行排序 sortColumns.forEach((sortColumn) { _entities.sort((a, b) { // 根据列名获取对应字段值 final dynamic valueA = a[sortColumn.name]; final dynamic valueB = b[sortColumn.name]; int compareResult; // 处理可比较类型的排序 if (valueA is Comparable && valueB is Comparable) { compareResult = valueA.compareTo(valueB); } else { // 非可比较类型转字符串后排序 compareResult = valueA.toString().compareTo(valueB.toString()); } // 根据排序方向调整结果 return sortColumn.sortDirection == SortDirection.ascending ? compareResult : -compareResult; }); }); // 重新构建DataGridRow集合 _dataGridRows = buildDataGridRows(_entities, downloadedItemIds, bulkAction); // 更新sortFields变量,用于后续加载数据时保持排序规则(可选) sortFields = sortColumns.map((e) => "${e.name} ${e.sortDirection.name}").join(","); // 通知表格刷新界面 notifyListeners(); }
3. 补充说明
- 上述逻辑假设你的
_entities元素是Map类型(从代码中element['instanceId']推断),如果是自定义实体类,需要把a[sortColumn.name]改为对应的属性访问,比如a.dateUpdated。 - 若需处理日期、数字等复杂类型排序,可以在
sort方法中增加类型判断和转换逻辑,确保排序结果符合预期。 - 如果需要在加载更多数据后保持当前排序状态,在
loadAndBuildPortfolioData和handleLoadMoreRows方法中,需将当前排序规则传递给后端接口,或者在数据加载完成后再次执行上述排序逻辑。
内容的提问来源于stack exchange,提问作者Hakob Beglaryan
相关产品推荐
相关产品推荐

