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

Syncfusion SFDataGrid列与单元格数据匹配错误求助

问题:Flutter中Syncfusion SfDataGrid列与单元格数据错位

在Flutter中使用Syncfusion的SfDataGrid实现表格功能时,所有数据均可正常显示,但单元格数据与对应列名不匹配,出现列内容错位的情况。

列与单元格数据错位

现有代码

表格定义代码

SfDataGridTheme(
          data: SfDataGridThemeData(
              headerColor: Theme.of(context).colorScheme.primary),
          child: SfDataGrid(
            key: key,
            allowPullToRefresh: true,
            source: InvestmentDataSource(
              investmentProvider: investmentProvider,
              investments: investmentProvider.investments,
            ),
            columnWidthMode: ColumnWidthMode.fitByColumnName,
            allowEditing: false,
            allowSorting: true,
            columns: <GridColumn>[ // 列定义
              getGridColumn('id', 'id'),
              getGridColumn('initAmount', 'Initial'),
              getGridColumn('recurringAmount', 'Rec. Amount'),
              getGridColumn('frequency', 'Frequency'),
              getGridColumn('duration', 'Duration'),
              getGridColumn('estReturn', 'Est. Return'),
              getGridColumn('category', 'Category'),
              getGridColumn('startDate', 'Start'),
              getGridColumn('endDate', 'End'),
              getGridColumn('action', 'Action'),
            ],
          ),
        ),

GridColumn getGridColumn(String colName, String displayText,
      {bool visibility = true}) {
    return GridColumn(
      visible: visibility,
      columnName: colName,
      label: Container(
        padding: EdgeInsets.symmetric(horizontal: 16.0),
        alignment: Alignment.centerLeft,
        child: Text(
          displayText,
          overflow: TextOverflow.ellipsis,
        ),
      ),
    );
  }

表格行创建代码

List<DataGridRow> createDataGridRows(List<Investment> investments) {
    return investments
        .map<DataGridRow>(
          (dataGridRow) => DataGridRow( // 行与单元格定义
            cells: [
              DataGridCell<int>(columnName: 'id', value: dataGridRow.key),
              DataGridCell<String>(
                  columnName: 'category', value: dataGridRow.investmentType),
              DataGridCell<double>(
                  columnName: 'initAmount',
                  value: dataGridRow.initialInvestment),
              DataGridCell<double>(
                  columnName: 'recurringAmount',
                  value: dataGridRow.recurringAddition),
              DataGridCell<String>(
                  columnName: 'frequency', value: dataGridRow.frequency),
              DataGridCell<num>(
                  columnName: 'duration', value: dataGridRow.investmentTerm),
              DataGridCell<double>(
                  columnName: 'estReturn', value: dataGridRow.terminalValue),
              DataGridCell<String>(
                  columnName: 'startDate', value: dataGridRow.startDate),
              DataGridCell<String>(
                  columnName: 'endDate', value: dataGridRow.endDate),
              DataGridCell<Widget>(
                columnName: 'action',
                value: null,
              ),
            ],
          ),
        )
        .toList();
  }

解决方法

Syncfusion SfDataGrid是按顺序匹配列与单元格的,即使columnName设置正确,只要columns列表的顺序和DataGridRow.cells的顺序不一致,就会出现内容错位。

当前代码中,columns的顺序是:id → initAmount → recurringAmount → frequency → duration → estReturn → category → startDate → endDate → action

但cells的顺序中,第二个单元格是category,而对应列的第二个是initAmount,这就导致了错位。

修正后的行创建代码

调整cells的顺序,使其与columns列表的顺序完全一致:

List<DataGridRow> createDataGridRows(List<Investment> investments) {
    return investments
        .map<DataGridRow>(
          (dataGridRow) => DataGridRow(
            cells: [
              DataGridCell<int>(columnName: 'id', value: dataGridRow.key),
              // 调整顺序:将initAmount移到第二位,对应columns的第二个列
              DataGridCell<double>(
                  columnName: 'initAmount',
                  value: dataGridRow.initialInvestment),
              DataGridCell<double>(
                  columnName: 'recurringAmount',
                  value: dataGridRow.recurringAddition),
              DataGridCell<String>(
                  columnName: 'frequency', value: dataGridRow.frequency),
              DataGridCell<num>(
                  columnName: 'duration', value: dataGridRow.investmentTerm),
              DataGridCell<double>(
                  columnName: 'estReturn', value: dataGridRow.terminalValue),
              // category移到第七位,对应columns的第七个列
              DataGridCell<String>(
                  columnName: 'category', value: dataGridRow.investmentType),
              DataGridCell<String>(
                  columnName: 'startDate', value: dataGridRow.startDate),
              DataGridCell<String>(
                  columnName: 'endDate', value: dataGridRow.endDate),
              DataGridCell<Widget>(
                columnName: 'action',
                value: null,
              ),
            ],
          ),
        )
        .toList();
  }

内容的提问来源于stack exchange,提问作者RV.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:25:25