搜索插件、代码仓与 APP 分类

table_sticky_headers 封面
插件详情v2.0.5

table_sticky_headers

二维表格,包含两个方向的固定表头。您可左右和上下滚动,固定表头始终可见,左上角的图例单元格也始终可见。

AndroidiOSWebmacOSWindowsLinux
近 30 天下载
3620
喜欢数
191
Pub 分数
150

安装插件

flutter pub add table_sticky_headers

插件介绍

基于插件公开信息、社区数据与项目使用情况整理的选型参考。

一个用于创建二维表格的 Flutter 包,支持固定表头在水平和垂直滚动时保持可见。左上角的“图例”单元格也固定不动,确保参考点始终一致。适用于需要在滚动过程中持续保留表头上下文的数据密集型界面。支持所有主要平台,包括移动设备、网页和桌面端。

适合场景

  • 带有持久表头的数据网格
  • 财务或库存仪表板
  • 复杂的表格布局与导航
  • 报告工具与大型数据集
  • 需要固定参考点的用户界面

主要特点

  • 粘性列和行标题
  • 固定图例单元格位于左上角
  • 平滑的水平和垂直滚动
  • 跨平台兼容性
  • 可自定义的样式和布局
  • 适用于各种屏幕尺寸的响应式设计

适合对象

  • 开发复杂数据表的开发者
  • 需要持续显示标题栏的应用程序
  • 带有大型数据集的仪表板
  • 带有表格数据的桌面和移动应用程序
  • 需要直观数据导航的UI

使用建议

  • 可能会影响非常大的数据集的性能
  • 需要仔细的布局规划以实现最佳用户体验
  • 内置的排序/筛选功能有限
  • 样式自定义可能需要高级的Flutter知识
  • 不太适合简单的单维列表

原始 README

以下为关联源码仓库的 README 原文快照,最新内容请访问源码仓库。

Table Sticky Headers

This package for Flutter allows you to display two-dimension table with both sticky headers.

Key of this package is sticky headers. You can scroll table any direction and headers (top and left) will always stay. Cells themselves are fully customizable as you can fill them with Widgets.

To work with table you need to fill it with data. It has three builders for generating title column (List), title row (List) and content itself (List.

Simplest UseCase. You have two-dimensional array of Strings. Builder takes value from array and generates Text widget:

contentCellBuilder: (i, j) => Text(data[i][j]),

For more advanced usage - decorate Text with other widgets like borders, cell colors, etc. Check decorated_example.dart to see it in action. You can also wrap cell with tap listeners and add custom behavior on tap. Check tap_handler_example.dart.

The cell dimensions can be customized using the cellDimensions property of StickyHeadersTable. Use:

  • CellDimensions.base: Default fixed values.
  • CellDimensions.uniform: Same dimensions for each cell.
  • CellDimensions.fixed: Custom fixed width and height for each content cell.
  • CellDimensions.variableColumnWidth: Different width for each column.
  • CellDimensions.variableRowHeight: Different height for each row.
  • CellDimensions.variableColumnWidthAndRowHeight: Different width for each column and different height for each row.

The alignment of the cell contents can be customized using the cellAlignments property of StickyHeadersTable. Use:

  • CellAlignments.base: Default alignment value (Alignment.center).
  • CellAlignments.uniform: Same alignment for each cell.
  • CellAlignments.fixed: Same alignment for each content cell, but different alignment for the sticky column, row and legend.
  • CellAlignments.variableColumnAlignment: Different alignment for each column.
  • CellAlignments.variableRowAlignment: Different alignment for each row.
  • CellAlignments.variable: Different alignment for every cell.

You can provide functions that execute when tapping a cell by setting the properties:

  • onStickyLegendPressed: () => print('Sticky legend pressed.'),
  • onColumnTitlePressed: (i) => print('Column $i title pressed.'),
  • onRowTitlePressed: (j) => print('Row $j title pressed.'),
  • onContentCellPressed: (i, j) => print('Cell at column $i, row $j pressed.'),

You can provide offset to the table for X and Y, by using either double offset or cell index offset:

  • initialScrollOffsetX
  • initialScrollOffsetY or
  • scrollOffsetIndexX
  • scrollOffsetIndexY

You can also set a callback for when the scrolling ends by setting the onEndScrolling property.

By combining the two above features, you can return to the previous scroll position after a rebuild. See example below:

double _scrollOffsetX = 0.0;
double _scrollOffsetY = 0.0;

StickyHeadersTable(
  // ... other properties ...
  initialScrollOffsetX: _scrollOffsetX,
  initialScrollOffsetY: _scrollOffsetY,
  onEndScrolling: (scrollOffsetX, scrollOffsetY) {
    _scrollOffsetX = scrollOffsetX;
    _scrollOffsetY = scrollOffsetY;
  },
)

You can also define a custom set of scroll controllers for both title and body with the scrollControllers property. IMPORTANT: don't forget to dispose your scroll controllers if you are using this field. Otherwise table will take care of disposal.

Feature requests and PRs are welcome.

Examples

Widget usage example:

// titleColumn - List<String> (title column)
// titleColumn - List<String> (title row)
// titleColumn - List<List<String>> (data)

StickyHeadersTable(
          columnsLength: titleColumn.length,
          rowsLength: titleRow.length,
          columnsTitleBuilder: (i) => Text(titleColumn[i]),
          rowsTitleBuilder: (i) => Text(titleRow[i]),
          contentCellBuilder: (i, j) => Text(data[i][j]),
          legendCell: Text('Sticky Legend'),
        ),

Visit examples to see it in details

Support

Please file issues and feature requests.

Project is on support-only mode. Feel free to contact me so I can share access rights to publish updates and maintain.

Getting Started

This project is a starting point for a Dart package, a library module containing code that can be shared easily across multiple Flutter or Dart projects.

For help getting started with Flutter, view our online documentation, which offers tutorials, samples, guidance on mobile development, and a full API reference.

所属分类

源码仓库

使用此插件的项目