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

如何让Flutter DataTable中的指定行不可点击?

解决方案:让DataTable最后一行(Gesamt)不可点击

完全可行,核心是通过条件控制onSelectChanged的赋值实现:当是Gesamt行时,把onSelectChanged设为null,Flutter会自动将该行标记为不可点击(无点击反馈、不会触发跳转);其他行保留原有的跳转逻辑。

具体修改方式

方式1:通过行内容判断(直接匹配Gesamt)

修改你的DataRow代码,给onSelectChanged加条件判断:

DataRow(
  // 关键:判断当前行是否是Gesamt,是则设为null,否则保留跳转逻辑
  onSelectChanged: brand['name'] == 'Gesamt' 
      ? null 
      : (bool? selected) {
          if (selected == true) { // 确保只有选中时才跳转
            Navigator.of(context).pushNamed(DetailScreen.routeName, arguments: {
              'pageType': 'Brand',
              'id': brand['name_slug'].toString(),
            });
          }
        },
  cells: [
    DataCell(Text(brand['name'])),
    DataCell(
      Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          Text(formatter.format(brand['goal'])),
        ],
      ),
    ),
    DataCell(
      Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          Text(formatter.format(brand['ist_stichtag'])),
        ],
      ),
    ),
    // 其他cells内容...
  ],
),

方式2:通过索引判断(通用适配最后一行)

如果Gesamt始终是列表的最后一行,也可以通过循环索引判断,适配性更强:

// 假设你通过循环生成DataRow,比如遍历品牌列表
brands.asMap().entries.map((entry) {
  final brand = entry.value;
  final isLastRow = entry.key == brands.length - 1; // 判断是否为最后一项

  return DataRow(
    onSelectChanged: isLastRow
        ? null
        : (bool? selected) {
            if (selected == true) {
              Navigator.of(context).pushNamed(DetailScreen.routeName, arguments: {
                'pageType': 'Brand',
                'id': brand['name_slug'].toString(),
              });
            }
          },
    cells: [
      // 你的cells内容...
    ],
  );
}).toList()

原理说明

在Flutter的DataRow中,当onSelectChanged为null时,该行会被视为不可选择,点击时不会触发任何回调,同时UI上会自动移除可点击的视觉反馈(比如高亮效果),完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:50:42