super_table_field 3.2.2
super_table_field: ^3.2.2 copied to clipboard
Super Table Field — a GeniusLink Flutter design-system package for ERP and accounting data grids. Includes read/edit modes, typed columns, change tracking, filtering, aggregations, selection stats, co [...]
super_table_field #
A generic Flutter data grid for ERP, accounting, inventory, and other data-heavy applications.
super_table_field provides a single SuperTable<R> widget backed by a
SuperTableController<R>. It supports read and edit workflows, typed
columns, validation, filtering, grouping, totals, pagination, change
tracking, export, selection, runtime column configuration, keyboard
navigation, and English/Arabic localization.
Table of contents
Features #
- Generic rows for both map-backed data and typed domain models.
- Readable and editable table modes.
- Typed text, numeric, currency, enumeration, combo, date, time, checkbox, computed, and other column types.
- Inline editors powered by the GeniusLink form-field packages.
- Local and async combo suggestions through
SuperAutoSuggestionsBox. - Search, per-column filters, and advanced cross-column filters.
- Sorting, multi-level grouping, aggregates, subtotals, and grand totals.
- Page, infinite-scroll, and load-more pagination flows.
- Single-cell, multi-cell, single-row, and multi-row selection.
- Runtime column resize, reorder, pin, visibility, and saved view state.
- Validation, unique constraints, and per-cell edit locking.
- Optional change tracking for added, modified, and deleted rows.
- Clipboard, CSV/TSV/JSON export, fill operations, undo, and redo.
- Expandable rows, interaction callbacks, and conditional styling.
- Table style presets for data-heavy and financial interfaces.
- English/Arabic localization with LTR and RTL support.
- Keyboard-first desktop workflows.
Get started #
Install #
Add super_table_field to your pubspec.yaml:
dependencies:
super_table_field: ^3.2.2
Then import the package:
import 'package:super_table_field/super_table_field.dart';
The package keeps its public barrel focused on table-owned APIs. Companion packages are not re-exported. If application code directly uses their APIs, import and declare them directly.
| Dependency | Package constraint |
|---|---|
| Dart | >=3.8.0 <4.0.0 |
| Flutter | >=3.32.0 |
super_core |
>=3.6.0 <4.0.0 |
super_auto_suggestion_box |
>=1.7.0 <2.0.0 |
super_form_field |
>=1.12.0 <2.0.0 |
Before upgrading between releases with API changes, review the migration guides.
Quick start #
Create one controller for the lifetime of the table and dispose it with the owning widget.
import 'package:flutter/material.dart';
import 'package:super_table_field/super_table_field.dart';
class ProductsPage extends StatefulWidget {
const ProductsPage({super.key});
@override
State<ProductsPage> createState() => _ProductsPageState();
}
class _ProductsPageState extends State<ProductsPage> {
late final SuperTableController<Map<String, dynamic>> controller;
@override
void initState() {
super.initState();
controller = SuperTableController<Map<String, dynamic>>(
mode: SuperTableMode.editable,
selectionMode: SuperSelectionMode.multiCells,
addRowEnabled: true,
trackChanges: true,
emptyRowValue: () => <String, dynamic>{},
columns: [
SuperTextColumn(
key: 'sku',
label: 'SKU',
required: true,
unique: true,
),
SuperTextColumn(
key: 'name',
label: 'Product',
width: 220,
),
SuperNumberColumn<int>(
key: 'quantity',
label: 'Quantity',
min: 0,
agg: SuperAgg.sum,
),
SuperCurrencyColumn(
key: 'price',
label: 'Price',
symbol: r'$',
min: 0,
),
],
rows: [
SuperRow.map({
'sku': 'PRD-001',
'name': 'Notebook',
'quantity': 12,
'price': 4.50,
}),
SuperRow.map({
'sku': 'PRD-002',
'name': 'Printer paper',
'quantity': 4,
'price': 8.75,
}),
],
);
}
@override
void dispose() {
controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Products')),
body: Padding(
padding: const EdgeInsets.all(16),
child: SuperTable<Map<String, dynamic>>(
controller: controller,
columnFilters: true,
advancedFilter: true,
showTotals: true,
),
),
);
}
}
SuperTable must receive bounded vertical space. In larger layouts,
place it inside Expanded, Flexible, SizedBox, or another widget
that supplies a height constraint.
Core API #
SuperTableController #
SuperTableController<R> owns the table state and data pipeline:
rows
→ search
→ filters
→ sorting
→ grouping
→ pagination
→ rendered table
It also owns editing, validation, selection, row operations, history, change tracking, column configuration, clipboard/export behavior, and load-more state.
Common controller operations include:
controller.setSearch('invoice');
controller.setMode(SuperTableMode.readable);
controller.setPage(1);
controller.addRow();
controller.duplicateRow();
controller.deleteRow();
controller.undo();
controller.redo();
final csv = controller.toCsv();
final tsv = controller.toTsv();
controller.acceptChanges();
controller.rejectChanges();
SuperTable #
SuperTable<R> is the view layer. Use it to control table presentation
and optional UI surfaces while keeping state in the controller.
SuperTable<MyRow>(
controller: controller,
columnFilters: true,
advancedFilter: true,
showTotals: true,
showFooter: true,
groupFooters: true,
columnManager: true,
style: SuperTableStyle.bandedRows,
)
Important view options include filtering UI, totals, pagination footer, formula bar, expandable rows, loading skeletons, interactions, runtime column management, and table-wide styling.
Rows #
Use SuperRow.map for map-backed data:
final row = SuperRow.map({
'code': '1001',
'name': 'Cash',
'balance': 12500.0,
});
Use SuperRow.of when the table is backed by a typed domain object:
final row = SuperRow.of(
account,
{
'code': account.code,
'name': account.name,
'balance': account.balance,
},
);
SuperRow.fingerPrint is a rebuild token for row-scoped editor
resources. Call row.randomFingerPrint() when a cell change should
invalidate dependent combo/select sources.
Columns #
| Column | Purpose |
|---|---|
SuperTextColumn |
Free-text values, validation, unique values, and optional bilingual cells. |
SuperNumberColumn |
Typed numeric values with min/max, decimals, formatting, and aggregation. |
SuperCurrencyColumn |
Monetary values with symbol/code formatting and aggregation. |
SuperEnumerationColumn |
Strict pick-only values backed by SuperSelectFormField sources. |
SuperComboColumn |
Pick-or-type values backed by SuperAutoSuggestionsBox. |
SuperProgressColumn |
Numeric progress values rendered as progress indicators. |
SuperColorColumn |
Color-oriented values and visual color cells. |
SuperDateColumn |
Date values with table editing and filtering support. |
SuperTimeColumn |
Time values with table editing and filtering support. |
SuperLinkColumn |
Link-like text values with dedicated rendering. |
SuperCheckboxColumn |
Boolean values rendered as checkboxes. |
SuperComputedColumn |
Read-only values computed from the current row. |
SuperReadonlyColumn |
Explicit read-only text values. |
Shared column options include width, alignment, pinning, editability, sorting, grouping, filtering, required/unique validation, formatters, aggregation, conditional styles, and custom read/write behavior.
Combo suggestions #
SuperComboColumn<T> uses SuperAutoSuggestionsBox for pick-or-type
editing. Static values are enough for simple cases:
SuperComboColumn<String>(
key: 'unit',
label: 'Unit',
values: const ['Piece', 'Box', 'Carton'],
allowFreeText: false,
)
For row-aware or remote data, build the source from the active cell:
SuperComboColumn<Account>(
key: 'account',
label: 'Account',
display: (account) => account.name,
allowFreeText: false,
debounce: const Duration(milliseconds: 350),
minResult: 2,
sourceController: (context, controller, row, cell) {
return SuperAutoSuggestionSources.async<Account>(
(context, query) async {
return repository.searchAccounts(query);
},
initialItems: cachedAccounts,
);
},
suggestionBuilder: (context, items, index, account) {
return SuperAutoSuggestionsItem<Account>(
value: account,
titleText: account.name,
subtitleText: account.code,
keywords: [account.code, account.name],
);
},
)
SuperComboColumn also exposes debounce and minResult. Local matches can be
shown immediately while remote work waits for the debounce window; minResult
controls when a small local result set should still be supplemented remotely.
Import super_auto_suggestion_box directly when application code
references SuperAutoSuggestionSources, SuperAutoSuggestionsItem, or
other APIs owned by that package.
Common operations #
The controller groups most table workflows into a small set of APIs:
| Workflow | Common APIs |
|---|---|
| Search and filters | setSearch, setColumnFilter, setAdvancedFilter, clearColumnFilters |
| Sorting and grouping | sortBy, clearSort, setGroupKeys, toggleGroup, clearGroups |
| Selection | selectCellAt, selectCells, selectRowAt, selectRowsAt, selectAll, clearSelection |
| Rows | addRow, insertRow, duplicateRow, deleteRow, moveRow |
| Columns | hideColumn, showColumn, setColumnPin, moveColumn, setWidth |
| History | undo, redo |
| Change tracking | changes, acceptChanges, rejectChanges, revertCell, revertRow |
| Export | toCsv, toTsv, copyCsvToClipboard, copyJson |
| Saved state | filterState, viewState, applyFilterState, applyViewState |
| Pagination | setPagination, setPage, requestLoadMore, setLoadMoreState |
For the complete signatures and available properties, use the generated API documentation rather than duplicating every option in this README.
Localization #
The package includes English and Arabic localizations.
MaterialApp(
localizationsDelegates:
SuperTableLocalization.localizationsDelegates,
supportedLocales:
SuperTableLocalization.supportedLocales,
home: const ProductsPage(),
)
Inside a table-related widget, the active localization can be read with:
final l10n = context.superTableLocalization;
RTL layout follows the active locale and Flutter directionality.
Examples #
The example application demonstrates the package as complete, runnable screens:
- Read-only report
- Editable journal
- Async combo suggestions
- Change tracking
- Export
- Validation views
- Interaction events
- Runtime column configuration
- Table styles
- Big data / load more
- Enumeration select
- Browse all example screens
Run the example application from the package's example directory when
you need a complete implementation rather than an isolated snippet.
Documentation #
The README is intentionally focused on the main workflows. Advanced API details should live in Dart documentation, runnable examples, migration guides, and the changelog.
Migration guides #
Changelog #
See CHANGELOG.md for release notes, new features,
behavior changes, fixes, and breaking changes.
License #
super_table_field is available under the terms in LICENSE.