data_table_2:基于 Flutter 的表格组件项目

兼容 flutter 3.22 和 ohos 的风味版

分支1Tags0
文件最后提交记录最后更新时间
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前
9 个月前

Pub Version GitHub Tests Codecov

! 请勿将组件放置在无边界的父组件内。您不再需要滚动组件(例如 SingleChildScrollView)——这些组件会自行处理滚动。如果需要在 Column() 内使用该组件,请将其包裹在 Expanded()Flexible() 中。

这是 Flutter 原生 DataTablePaginatedDataTable 组件的就地替代方案,具有固定/粘性表头/顶部行和左侧列功能。同时还添加了一些原生组件所缺少的实用功能。

DataTable2PaginatedDataTable2 组件基于 Flutter 原生组件的源代码构建,模仿其 API 并提供无缝集成。

如果您一直在使用(或考虑使用)Flutter 标准组件来显示表格或数据网格,并且希望获得粘性表头(或垂直边框、“无数据行”占位符、直观的异步数据源 API 等)功能——那么您来对地方了。无需学习新控件的全新 API,只需沿用广为人知的 DataTable 和 PaginatedDataTable 即可。

在线演示

image

请查看 示例文件夹,其中演示了这些组件的各种功能。另一个独立仓库中的 DataGrid 示例 也是基于 DataTable2 构建的。

额外功能

  • 粘性表头和分页器(使用 PaginatedDataTable2 时)
    • 粘性行的数量由 DataTable2.fixedTopRows 定义
    • 粘性左列 DataTable2.fixedLeftColumns
  • 主区域(包含数据行)可垂直滚动
    • PaginatedDataTable2 上的 autoRowsToHeight 属性允许根据高度适配的行数自动计算页面大小,从而无需垂直滚动
    • 通过 isVerticalScrollBarVisibleisHorizontalScrollBarVisible 控制垂直和水平滚动条的可见性
  • 所有列均为固定宽度,表格会自动水平拉伸,单个列的宽度计算公式为 (总宽度)/(列数)
    • 若需调整列宽,可将 DataColumn 定义替换为 DataColumn2DataColumn 的子类)。该类提供 size 属性,可设置为三种相对尺寸(S、M 和 L)之一
    • 小(Small)与中(Medium)、大(Large)与中(Medium)列之间的宽度比例由 smRatiolmRatio 参数定义
    • fixedWidth 参数允许为列宽定义绝对值
    • 可通过设置 minWidth 属性限制控件的最小宽度,当视口较窄时可水平滚动,这在多列无法适应屏幕的竖屏方向下非常有用
    • 可通过设置 bottomMargin 属性添加底部边距,以允许轻微的过度滚动
    • 固定宽度列比 DataTable 的默认实现更快,后者需要两次计算来确定内容大小并调整列宽
  • 数据行被包裹在 FlexibleSingleScrollView 组件中,使组件能够填充父容器并支持滚动
    • 垂直滚动控制器通过表格的 scrollController 属性暴露。参见示例“DataTable2 - Scroll-up”,该示例在向下滚动时显示“向上”按钮,并允许跳转到表格顶部
    • PaginatedDataTable2.fit 属性控制分页器是否固定在底部,并在上方数据行之间留出间隙
  • DataRow2 作为标准 DataRow 的替代方案,提供行级点击事件(包括右键点击)
    • PaginatedDataTable2.renderEmptyRowsInTheEnd 属性改变了 Flutter 默认渲染带空行页面的方式
    • DataRow2.specificRowHeight 允许覆盖任何行的默认高度
  • 通过 sortArrowIconsortArrowAnimationDuration 属性覆盖排序箭头,通过 sortArrowBuilder 自定义箭头构建器
  • 通过 headingCheckboxThemedatarowCheckboxThemecheckboxAlignment 自定义 DataTable2 中的复选框
  • empty 属性允许定义数据源为空时显示的占位组件
  • border 允许绘制内部和外部的垂直与水平边框(例如勾勒单个单元格)——标准组件仅允许绘制水平行分隔线
  • PaginatorController 允许从外部控制 PaginatedDataTable2 的状态(例如切换页面、更改页面大小等)
  • 实验性 AsynPaginatedDataTable2 组件,专为异步场景(如从 Web 服务请求数据)构建,依赖 AsyncDataTableSourceFuture 形式返回行数据

使用方法

注意: 请勿将组件放入任何具有无限宽高的非约束性父容器中(例如 SingleChildScrollView、Column 等可滚动组件)。这些组件设计为可拉伸并填充父容器内的所有可用空间,且内部包含多个自有滚动组件以实现固定行/列功能。将其放入非约束性父容器会导致组件功能异常。

  1. 在 pubspec.yaml 中添加引用。

  2. 导入:

import 'package:data_table_2/data_table_2.dart';
  1. 代码:
import 'package:data_table_2/data_table_2.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';

/// Example without a datasource
class DataTable2SimpleDemo extends StatelessWidget {
  const DataTable2SimpleDemo();

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(16),
      child: DataTable2(
          columnSpacing: 12,
          horizontalMargin: 12,
          minWidth: 600,
          columns: [
            DataColumn2(
              label: Text('Column A'),
              size: ColumnSize.L,
            ),
            DataColumn(
              label: Text('Column B'),
            ),
            DataColumn(
              label: Text('Column C'),
            ),
            DataColumn(
              label: Text('Column D'),
            ),
            DataColumn(
              label: Text('Column NUMBERS'),
              numeric: true,
            ),
          ],
          rows: List<DataRow>.generate(
              100,
              (index) => DataRow(cells: [
                    DataCell(Text('A' * (10 - index % 10))),
                    DataCell(Text('B' * (10 - (index + 5) % 10))),
                    DataCell(Text('C' * (15 - (index + 5) % 10))),
                    DataCell(Text('D' * (15 - (index + 10) % 10))),
                    DataCell(Text(((index + 0.1) * 25.4).toString()))
                  ]))),
    );
  }
}

如果你已经在使用标准组件,只需引入该包,并在原生组件名称后添加“2”(使其变为DataTable2PaginatedDataTable2)即可。

已知问题/限制/注意事项

  • 不支持根据内容调整数据表格单元格大小。列宽会适应可用宽度(父容器宽度或minWidth),数据行宽度由构造函数参数预先定义。不适合单元格的内容将被裁剪
    • 原生数据表格中的dataRowMinHeight和dataRowMaxHeight也不受支持
  • 不支持展开/折叠行(下钻场景)、手动移动或调整列或行的大小、合并单元格(即HTML中的colspan、rowspan)
  • 固定左列时,悬停在行上不会高亮整行(如果有任何点击处理程序,标准行为是悬停行时更改其背景)
  • 在Chrome的移动设备模拟下,触摸滚动不起作用/会跳屏(https://github.com/maxim-saplin/data_table_2/issues/100)
  • 单元格和行的点击事件会阻塞DataRow.onSelectChanged事件处理程序
  • 要使复选框列可见,必须将DataTable2.showCheckboxColumn设置为true,并且必须有一些行的onSelectChanged事件处理程序不为null
  • 默认情况下,如果页面大于可用行数,分页表格会添加空行,可通过renderEmptyRowsInTheEnd进行更改
  • 在Linux上,黄金测试可能会失败,因为渲染的图像与在macOS上创建并存储在仓库中的图像不同,PR @157

项目介绍

兼容 flutter 3.22 和 ohos 的风味版

定制我的领域