搜尋分類、套件與程式碼儲存庫

data_table_2 封面
套件詳情v3.0.0

data_table_2

Flutter 的 DataTable 和 PaginatedDataTable 的即時取代品,支援固定/黏滯表頭以及一些額外功能

AndroidiOSWebmacOSWindowsLinux
近 30 天下載
22萬
喜歡數
984
Pub 分數
160

安裝套件

flutter pub add data_table_2

套件介紹

根據套件公開資料產生的選型評估,僅供參考。

data_table_2 是一個 Flutter 套件,可作為 Flutter 內建 DataTable 和 PaginatedDataTable 的即插即用替代品。它透過固定或黏滯標頭、改進的捲動行為以及額外的自訂選項來增強表格功能。專為大型資料集中的更好可用性而設計,在保持效能的同時提供欄位調整大小和排序等功能。適用於需要結構化資料顯示並具備增強互動性和視覺清晰度的應用程式。

適用情境

  • 顯示具有黏性標題的大數據集
  • 在網頁和行動應用中建立響應式表格
  • 用增強功能取代標準 DataTable
  • 使用可排序、可調整大小的欄位建構管理面板
  • 使用平滑滾動實現分頁數據視圖

主要特色

  • 黏性/固定表頭
  • 欄位調整大小支援
  • 改進的滾動性能
  • 內建排序和篩選
  • 可自定樣式和佈局
  • 支援 DataTable 和 PaginatedDataTable 的使用案例

適合對象

  • 需要高級表格功能的開發人員
  • 包含大量表格數據的應用程式
  • 跨平台表格實現
  • UI密集型的儀表板和管理介面
  • 需要黏性標題但無需自定義程式碼的專案

使用建議

  • 需要從標準 DataTable 進行遷移
  • 與核心組件相比,文件較少
  • 可能會稍微增加封裝大小
  • 不適合非常簡單的靜態表格
  • 在需要進階表格行為時使用最佳

原始 README

以下為關聯原始碼儲存庫的 README 原文快照,最新內容請造訪原始碼儲存庫。

Pub Version GitHub Tests Codecov

! Don't put the widgets inside unbounded parents. You don't need scrollables anymore (e.g. SingleChildScrollView) - widgets handle scrolling by theirselves. If you need a widget inside a Column(), wrap it into Expanded() or Flexible().

In-place substitute for Flutter's stock DataTable and PaginatedDataTable widgets with fixed/sticky header/top rows and left columns. A few useful features missing in the originals were added.

DataTable2 and PaginatedDataTable2 widgets are based on the sources of Flutter's originals, mimic the API and provide seamless integration.

If you've been using (or considered using) standard Flutter's widgets for displaying tables or data grids and missed the sticky headers (or vertical borders, 'No rows' placeholder, straightforward async data source API etc.) - you've come to the right place. No need to learn yet another API of a new control, just stick to well described DataTable and PaginatedDataTable.

LIVE DEMO

image

Please check the example folder which demonstrates various features of the widgets. There's also a DataGrid Sample in separate repo which is based on DataTable2.

Extra Features

  • Sticky headers and paginator (when using PaginatedDataTable2)
    • The number of sticky rows is defined by DataTable2.fixedTopRows
    • Sticky left columns DataTable2.fixedLeftColumns
  • Vertically scrollable main area (with data rows)
    • autoRowsToHeight property on PaginatedDataTable2 allows to auto calculate page size depending on how much rows fit the height and makes vertical scrolling unnecessary
    • Vertical and horizontal scroll visibility via isVerticalScrollBarVisible and isHorizontalScrollBarVisible
  • All columns are fixed width, table automatically stretches horizontally, individual column's width is determined as (Width)/(Number of Columns)
    • Should you want to adjust sizes of columns, you can replace DataColumn definitions with DataColumn2 (which is a descendant of DataColumn). The class provides size property which can be set to one of 3 relative sizes (S, M and L)
    • Width ratios between Small and Medium, Large and Medium columns are defined by smRatio and lmRatio params
    • fixedWidth parameter allows to define absolute value for column width
    • You can limit the minimal width of the control and scroll it horizontally if the viewport is narrower (by setting minWidth property) which is useful in portrait orientations with multiple columns not fitting the screen
    • You can add bottom margin (by setting bottomMargin property) to allow slight over-scroll
    • Fixed width columns are faster than default implementation of DataTable which does 2 passes to determine contents size and justify column widths
  • Data rows are wrapped in Flexible and SingleScrollView widgets to allow widget to fill parent container and be scrollable
    • Vertical scroller is exposed via table's scrollController property. See example 'DataTable2 - Scroll-up' which shows 'up' button when scrolling down and allows to jump to the top of the table
    • PaginatedDataTable2.fit property controls whether the paginator sticks to the bottom and leaves a gap to data rows above
  • There's DataRow2 alternative to stock DataRow which provides row level tap events (including right clicks)
    • PaginatedDataTable2.renderEmptyRowsInTheEnd property changes the default Flutter way of rendering pages with empty rows
    • DataRow2.specificRowHeight allows overriding default height for any row
  • Overriding sort arrows via sortArrowIcon and sortArrowAnimationDuration properties, custom arrow builder with sortArrowBuilder
  • Customizing checkboxes in DataTable2 via headingCheckboxTheme, datarowCheckboxTheme and checkboxAlignment
  • empty property which allows defining a placeholder widget to be displayed when data source is empty
  • border allows drawing inner and outer vertical and horizontal borders (e.g. outlining individual cells) - stock widgets only allow drawing horizontal row splitters
  • PaginatorController allows to externally control PaginatedDataTable2 state (e.g. switch pages, change page size etc.)
  • Experimental AsynPaginatedDataTable2 widget built for asynchronous scenarios (such a requesting data from a web service) relying on AsyncDataTableSource returning rows in a Future

Usage

NOTE:* don't put the widgets into any unconstrained parents with infinite width or height (e.g. scrollables such as SingleChildScrollView, Column etc.). The widgets are designed to stretch and fill all available space within parent and have a number of own scrollables inside to address fixed rows/columns feature. Putting it inside unconstrained parent break widgets.

  1. Add reference to pubspec.yaml (v3+ also requires material_ui):
dependencies:
  data_table_2: ^3.0.0
  material_ui: ^1.0.0
  1. Import:
import 'package:data_table_2/data_table_2.dart';
import 'package:material_ui/material_ui.dart';
  1. Code:
import 'package:data_table_2/data_table_2.dart';
import 'package:material_ui/material_ui.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()))
                  ]))),
    );
  }
}

If you're already using the standard widgets you can reference the package and add '2' to the names of stock widgets (making them DataTable2 or PaginatedDataTable2) and that is it.

Breaking change in 3.0.0: Material widgets and types (DataColumn, DataRow, DataTable, etc.) now come from the standalone material_ui package instead of package:flutter/material.dart. Add material_ui to your dependencies and update Material imports. Public types in this package extend Material classes from material_ui, so mixing SDK Material imports with data_table_2 3.x can cause type identity mismatches.

If your app uses localized Material widgets (e.g. paginator labels), replace flutter_localizations Material delegates with material_ui:

import 'package:material_ui/material_ui.dart';

MaterialApp(
  localizationsDelegates: GlobalMaterialLocalizations.delegates,
  // ...
)

Do not import both package:flutter_localizations/flutter_localizations.dart and package:material_ui/material_ui.dart without hide/as prefixes — GlobalMaterialLocalizations is defined in both and will cause ambiguous-import errors.

Know issues/limitations/caveats

  • There's no capability to size data table cells to fit contents. Column width's adapt to available width (either to parent width or minWidth), data rows width are predefined by constructor params. Content that doesn't fit a cell gets clipped
    • dataRowMinHeight and dataRowMaxHeight from the stock data table are also not supported
  • There're no expanding/collapsing rows (drill-down scenarios), manually moving or resizing columns or rows, merging cells (i.e. HTML's colspan, rowspan)
  • When fixing left columns, hovering over a row won't highlight entire row (should there be any tap handlers standard behavior is hovering a row changes it background)
  • Touch scrolling not working/jumping under mobile device emulation in Chrome (https://github.com/maxim-saplin/data_table_2/issues/100)
  • Cell and row tap events block DataRow.onSelectChanged event handler
  • In order to get checkbox column visible it is necessary to have DataTable2.showCheckboxColumn set to true AND there must be some rows with onSelectChanged event handler being not null
  • Paginated table's by default add empty rows should the page be larger than the number of available rows, can be changed via renderEmptyRowsInTheEnd
  • Golden tests can fail on Linux due to rendered images being different from the ones created on macOS and stored in the repo, PR @157

所屬分類

依賴

依賴清單 2 項

原始碼儲存庫

使用此套件的專案