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

Flutter DataTable点击单元格始终获取最后一行值问题求助

Flutter DataTable点击行/单元格获取正确值的解决方案

问题根源

你遇到的问题是闭包捕获变量引用导致的:cellValue定义在循环外部,onTap和onSelectChanged作为闭包,捕获的是cellValue的引用而非循环时的具体值。循环结束后,cellValue保留的是最后一次赋值的内容,因此所有点击事件都会输出这个最后值。

修复方案

  1. 在单元格循环内部创建局部变量,保存当前单元格的cellValue,让闭包捕获这个局部变量;
  2. 行选择事件onSelectChanged直接使用当前行的数据源,避免依赖单元格变量,更符合行选择的业务逻辑。

修改后的代码

List<DataRow> dataRows = [];
final formatter = NumberFormat('#,##0;(#,##0)');
for (int z = 0; z < widget.data.length; z++) {
  // 保存当前行的数据,供行选择事件使用
  final currentRowData = widget.data[z];
  dataRows.add(DataRow(
      cells: [],
      onSelectChanged: (selected) {
        if (selected!) {
          // 可根据需求从当前行数据中提取任意字段
          final rowIdentifier = currentRowData['col1'].toString();
          debugPrint('row-selected: $rowIdentifier');
        }
      }));
  int ii = 0;
  for (int i = 0; i < noOfColumns; i++) {
    ii = i + 1;
    // 局部变量保存当前单元格的值,避免闭包引用问题
    final cellValue;
    if (columnTypes[i] == 'N') {
      cellValue = formatter.format(double.parse(currentRowData['col$ii']));
    } else {
      cellValue = currentRowData['col$ii'].toString();
    }
    dataRows[z].cells.add(
          DataCell(
            Text('--$cellValue'),
            onTap: () {
              debugPrint(
                  "onTap Pressed ====>$cellValue-------${TimeOfDay.now()}");
            },
          ),
        );
  }
}

改动说明

  • 新增currentRowData变量保存当前循环的行数据,避免闭包捕获循环变量z的引用问题;
  • 单元格循环内将cellValue改为局部变量,确保每个onTap闭包捕获的是当前单元格的具体值;
  • 行选择事件直接使用currentRowData,可灵活获取整行任意列的数据,逻辑更合理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:45:06