兼容 flutter 3.22 和 ohos 的风味版
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 | ||
| 9 个月前 |
! 请勿将组件放置在无边界的父组件内。您不再需要滚动组件(例如 SingleChildScrollView)——这些组件会自行处理滚动。如果需要在 Column() 内使用该组件,请将其包裹在 Expanded() 或 Flexible() 中。
这是 Flutter 原生 DataTable 和 PaginatedDataTable 组件的就地替代方案,具有固定/粘性表头/顶部行和左侧列功能。同时还添加了一些原生组件所缺少的实用功能。
DataTable2 和 PaginatedDataTable2 组件基于 Flutter 原生组件的源代码构建,模仿其 API 并提供无缝集成。
如果您一直在使用(或考虑使用)Flutter 标准组件来显示表格或数据网格,并且希望获得粘性表头(或垂直边框、“无数据行”占位符、直观的异步数据源 API 等)功能——那么您来对地方了。无需学习新控件的全新 API,只需沿用广为人知的 DataTable 和 PaginatedDataTable 即可。
在线演示
请查看 示例文件夹,其中演示了这些组件的各种功能。另一个独立仓库中的 DataGrid 示例 也是基于 DataTable2 构建的。
额外功能
- 粘性表头和分页器(使用
PaginatedDataTable2时)- 粘性行的数量由
DataTable2.fixedTopRows定义 - 粘性左列
DataTable2.fixedLeftColumns
- 粘性行的数量由
- 主区域(包含数据行)可垂直滚动
- PaginatedDataTable2 上的
autoRowsToHeight属性允许根据高度适配的行数自动计算页面大小,从而无需垂直滚动 - 通过
isVerticalScrollBarVisible和isHorizontalScrollBarVisible控制垂直和水平滚动条的可见性
- PaginatedDataTable2 上的
- 所有列均为固定宽度,表格会自动水平拉伸,单个列的宽度计算公式为 (总宽度)/(列数)
- 若需调整列宽,可将
DataColumn定义替换为DataColumn2(DataColumn的子类)。该类提供size属性,可设置为三种相对尺寸(S、M 和 L)之一 - 小(Small)与中(Medium)、大(Large)与中(Medium)列之间的宽度比例由
smRatio和lmRatio参数定义 fixedWidth参数允许为列宽定义绝对值- 可通过设置
minWidth属性限制控件的最小宽度,当视口较窄时可水平滚动,这在多列无法适应屏幕的竖屏方向下非常有用 - 可通过设置
bottomMargin属性添加底部边距,以允许轻微的过度滚动 - 固定宽度列比 DataTable 的默认实现更快,后者需要两次计算来确定内容大小并调整列宽
- 若需调整列宽,可将
- 数据行被包裹在
Flexible和SingleScrollView组件中,使组件能够填充父容器并支持滚动- 垂直滚动控制器通过表格的
scrollController属性暴露。参见示例“DataTable2 - Scroll-up”,该示例在向下滚动时显示“向上”按钮,并允许跳转到表格顶部 PaginatedDataTable2.fit属性控制分页器是否固定在底部,并在上方数据行之间留出间隙
- 垂直滚动控制器通过表格的
DataRow2作为标准DataRow的替代方案,提供行级点击事件(包括右键点击)PaginatedDataTable2.renderEmptyRowsInTheEnd属性改变了 Flutter 默认渲染带空行页面的方式DataRow2.specificRowHeight允许覆盖任何行的默认高度
- 通过
sortArrowIcon和sortArrowAnimationDuration属性覆盖排序箭头,通过sortArrowBuilder自定义箭头构建器 - 通过
headingCheckboxTheme、datarowCheckboxTheme和checkboxAlignment自定义 DataTable2 中的复选框 empty属性允许定义数据源为空时显示的占位组件border允许绘制内部和外部的垂直与水平边框(例如勾勒单个单元格)——标准组件仅允许绘制水平行分隔线PaginatorController允许从外部控制PaginatedDataTable2的状态(例如切换页面、更改页面大小等)- 实验性
AsynPaginatedDataTable2组件,专为异步场景(如从 Web 服务请求数据)构建,依赖AsyncDataTableSource以Future形式返回行数据
使用方法
注意: 请勿将组件放入任何具有无限宽高的非约束性父容器中(例如 SingleChildScrollView、Column 等可滚动组件)。这些组件设计为可拉伸并填充父容器内的所有可用空间,且内部包含多个自有滚动组件以实现固定行/列功能。将其放入非约束性父容器会导致组件功能异常。
-
在 pubspec.yaml 中添加引用。
-
导入:
import 'package:data_table_2/data_table_2.dart';
- 代码:
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”(使其变为DataTable2或PaginatedDataTable2)即可。
已知问题/限制/注意事项
- 不支持根据内容调整数据表格单元格大小。列宽会适应可用宽度(父容器宽度或
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
