Search code examples
flutterdatatableontap

Flutter DataTable onTap selects last value


I am relatively new tro flutter. I am trying to create a DataTable that the user could Tap on and take some action based on which row was clicked. However, when the user taps on any cell, it picks up the last value (bottom left of the table) irrespective of which cell or row is Tap'ed. Also tried onSelectChanged

List<DataRow> dataRows = [];
    String cellValue = '';
    final formatter = NumberFormat('#,##0;(#,##0)');
    for (int z = 0; z < widget.data.length; z++) {
      dataRows.add(DataRow(
          cells: [],
          onSelectChanged: (selected) {
            if (selected!) {
              debugPrint('row-selected: $cellValue');
            }
          }));
      int ii = 0;
      for (int i = 0; i < noOfColumns; i++) {
        ii = i + 1;
        if (columnTypes[i] == 'N') {
          cellValue = formatter.format(double.parse(widget.data[z]['col$ii']));
        } else {
          cellValue = widget.data[z]['col$ii'].toString();
        }
        dataRows[z].cells.add(
              DataCell(
                Text('--$cellValue'),
                onTap: () => {
                  debugPrint(
                      "onTap Pressed ====>$cellValue-------${TimeOfDay.now()}")
                },
              ),
            );
      }
    }

Solution

  • The way you coded it makes it take the cellValue that it was last because it was declared in the outer scope. Try introducing a local variable in the local scope instead by replacing

        dataRows[z].cells.add(
              DataCell(
                Text('--$cellValue'),
                onTap: () => {
                  debugPrint(
                      "onTap Pressed ====>$cellValue-------${TimeOfDay.now()}")
                },
              ),
            );
    

    with

        String someString = cellValue;
        dataRows[z].cells.add(
              DataCell(
                Text('--$cellValue'),
                onTap: () => {
                  debugPrint(
                      "onTap Pressed ====>$someString -------${TimeOfDay.now()}")
                },
              ),
            );