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

Flutter:如何实现双DataTable对应行同步悬停高亮?

实现双DataTable行同步高亮方案

要解决左右两个DataTable行同步高亮的问题,核心是共享高亮状态,手动控制行的背景色(默认DataTable的行高亮是内部逻辑,无法跨组件同步)。以下是具体实现步骤:

步骤1:添加状态变量

在你的State类中新增变量,记录当前悬停/选中的行索引:

int? _hoveredRowIndex;

步骤2:自定义DataRow的交互与背景色

修改左右两个表格的rows生成逻辑,给每个DataRow添加鼠标事件同步状态,并根据索引匹配设置高亮背景:

左侧固定表格行修改

rows: leftFixedRows.asMap().entries.map((entry) {
  final index = entry.key;
  final row = entry.value;
  return DataRow(
    color: MaterialStateProperty.resolveWith((states) {
      // 索引匹配时返回高亮色
      if (_hoveredRowIndex == index) {
        return Colors.grey[200]; // 替换为你需要的高亮颜色
      }
      return null; // 默认背景色
    }),
    cells: row.cells,
    // 鼠标悬停同步状态
    onHover: (isHovered) {
      setState(() {
        _hoveredRowIndex = isHovered ? index : null;
      });
    },
    // 可选:点击事件同步高亮
    onSelectChanged: (selected) {
      setState(() {
        _hoveredRowIndex = selected == true ? index : null;
      });
    },
  );
}).toList(),

右侧滚动表格行修改

rows: centerFixedRows.asMap().entries.map((entry) {
  final index = entry.key;
  final row = entry.value;
  return DataRow(
    color: MaterialStateProperty.resolveWith((states) {
      if (_hoveredRowIndex == index) {
        return Colors.grey[200]; // 和左侧使用相同高亮色
      }
      return null;
    }),
    cells: row.cells,
    onHover: (isHovered) {
      setState(() {
        _hoveredRowIndex = isHovered ? index : null;
      });
    },
    onSelectChanged: (selected) {
      setState(() {
        _hoveredRowIndex = selected == true ? index : null;
      });
    },
  );
}).toList(),

步骤3:保证行索引对应

需确保leftFixedRows和centerFixedRows的行数完全一致,这样索引才能一一对应,同步高亮才能生效。

替代方案:使用第三方库

如果不想手动实现,推荐用专门的表格库,这类库已内置固定列和行同步高亮功能:

  • data_table_2:支持固定列、横向滚动,原生支持行悬停/选中同步高亮
  • flutter_sticky_header:结合Table组件实现粘性表头+固定列,可快速自定义行交互逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 03:10:13