Flutter DataTable点击单元格始终获取最后一行值问题求助
Flutter DataTable点击行/单元格获取正确值的解决方案
问题根源
你遇到的问题是闭包捕获变量引用导致的:cellValue定义在循环外部,onTap和onSelectChanged作为闭包,捕获的是cellValue的引用而非循环时的具体值。循环结束后,cellValue保留的是最后一次赋值的内容,因此所有点击事件都会输出这个最后值。
修复方案
- 在单元格循环内部创建局部变量,保存当前单元格的
cellValue,让闭包捕获这个局部变量; - 行选择事件
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
相关产品推荐
相关产品推荐

