如何让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
相关产品推荐
相关产品推荐

