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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:05:17