grid_sheet 3.0.0 copy "grid_sheet: ^3.0.0" to clipboard
grid_sheet: ^3.0.0 copied to clipboard

A powerful Flutter DataGrid/DataTable for large datasets, offering Excel-like features and fully customizable cells — ready with minimal setup. See README for full features

Changelog #

3.0.0 #

This is a breaking release. Every renamed or removed API is listed with its replacement in Migration Guide.

Breaking Changes #

  • GridSheet.rows and GridSheet.columns now follow the widget like any Flutter input: passing different rows or columns updates the grid (keeping sort, filters, grouping, the page, and surviving selection and expansion) instead of being ignored after the first build.
  • Grouped GridSheetManager members by area: rows, columns, cells, selection, filters, search, sorting, pagination, formatting, formulas, data, changes, config, cursor, loading, autoReload and snapshots. gridManager.rows/columns are no longer lists; use rows.all/columns.all.
  • Removed the index- and name-based manager methods; rows and columns are addressed by ValueKey<String>. Use rows.at, columns.at or columns.findByNames to get a key.
  • Dropped the ByKeys/ByKey suffixes and get prefixes (e.g. selectRowsByKeys → selection.selectRows, getSelectedRows() → selection.rows).
  • Replaced the onlyFilteredRows/onlyCurrentPageRows/onlyVisibleColumns flags with GridSheetRowScope and GridSheetColumnScope.
  • Changed sorting, filters, data.statistics, data.groupBy, columns.setWidths/widths/rename, cells.find/findAndReplace and GridSheetCellContext.onFilterChanged to identify columns by key instead of name.
  • Replaced the conditional format rule editing methods with formatting.setRules(rules), which takes the whole list in priority order.
  • Removed the position parameter of rows.insert/columns.insert; placement comes from rowInsertPosition/columnInsertPosition. rows.insertAt/columns.insertAt take a target key.
  • Renamed GridSheetRowInsertPosition.aboveSelection/belowSelection to above/below, and GridSheetColumnInsertPosition.beforeSelection/afterSelection to before/after.
  • Changed GridSheetSortState to take named arguments and carry the column key; renamed columnName to name.
  • Changed GridSheetColumnType from an enum to constructors (e.g. GridSheetColumnType.text()), checked with type.kind; dropdownOptions and showFormulaInEdit moved into dropdown(options:) and formula(showFormulaOnFocus:).
  • Changed headerWrapper, filterWrapper and rowWrapper to receive a details object with the grid manager.
  • Merged rowStateColorBuilder and rowStateIconBuilder into rowStateIndicatorBuilder, which returns a GridSheetRowStateIndicator with an optional color and icon. The GridSheetRowStateColorBuilder/GridSheetRowStateIconBuilder typedefs are replaced by GridSheetRowStateIndicatorBuilder.
  • Renamed rowExpandedWidgetBuilder to rowExpandedBuilder and added gridManager to it.
  • Added context and gridManager to GridSheetFormConfiguration.topBarBuilder/bottomBarBuilder (formerly headerBuilder/footerBuilder), which now take (context, row, gridManager). GridSheet.topBarBuilder/bottomBarBuilder still take (gridManager).
  • Renamed GridSheet parameters: contextMenuWidget → contextMenuBuilder, headerWidget/footerWidget → topBarBuilder/bottomBarBuilder, undoDeleteWidget → undoDeleteBuilder, noRowsWidget/noColumnsWidget → emptyRowsPlaceholder/emptyColumnsPlaceholder, loadingWidget → loadingIndicator, autofillConfiguration → autoFillConfiguration and tableGenerationConfiguration → dynamicGenerationConfiguration.
  • Replaced GridSheetDynamicTableGeneration with GridSheetDynamicGenerationConfiguration, without enabled. GridSheet.dynamicGenerationConfiguration is now nullable.
  • Renamed GridSheetConfiguration.selectOnlyPageRows to selectOnlyCurrentPageRows, and filterBlanksText/filterNonBlanksText to blanksText/noBlanksText.
  • Renamed GridSheetConstants.filterBlanksText/filterNoBlanksText to blanksText/noBlanksText.
  • Moved GridSheetFormConfiguration.mode to GridSheet.viewMode, and renamed GridSheetFormConfiguration.headerBuilder/footerBuilder to topBarBuilder/bottomBarBuilder. The old auto mode is now GridSheetViewMode.responsive.
  • Renamed GridSheetStyleConfiguration.ascSortIconColor/descSortIconColor to ascendingSortIconColor/descendingSortIconColor, and footerRowBorderColor to bottomBarBorderColor.
  • Renamed GridSheetColumn.resize to resizable, and replaced noTextControllerWidget with hasTextController (inverted, defaults to true).
  • Renamed IGridSheetCustomCellWidgetBuilder to IGridSheetCustomCellBuilder, and the GridSheetCustomCellWidgetBuilder typedef (the type of GridSheet.cellBuilder) to GridSheetCellBuilder.
  • Removed the public GridSheetState.refresh(). Use notifyListeners() to rebuild the grid after state it reads changed outside of it.
  • Changed onLoaded, onRowsSelected, onColumnsSelected, onCellsSelected, onCellValueChanged, onColumnReorder and onRowReorder to return void, like the other callbacks. The grid never used their return value.
  • Renamed GridSheetConditionalFormatRule.backgroundColorExpression to expression, and removed GridSheetFormatScope.column (use cell).
  • Renamed the expression variables row_state, cell_value, column_name and column_index to _row_state, _cell_value, _column_name and _column_index.
  • Renamed searchExactMatchCase to searchExactMatch on GridSheetPageRequest and GridSheetSnapshot.
  • Made GridSheetCellContext.gridManager non-nullable.
  • Made GridSheetRow.originalData read-only and removed it from the constructor and copyWith.
  • Removed GridSheetRow's bookkeeping methods (markAsInserted, markAsModified, markAsDeleted, setDataAt, replaceData, setHeight, resetHeight, mutableDataForInternalUse, formatCacheForColumn, clearFormatCache, dispose). Use the manager instead.
  • Removed the GridSheetManagerHelpers, GridSheetRowHelper, GridSheetColumnListHelper and GridSheetRowExtension extensions. rowDataToMap is now GridSheetRow.toParsedDataMap.
  • Changed rows given to the grid in the inserted, modified or deleted state on its first build (e.g. a restored draft) to be listed in changes.inserted/modified/deleted, as they already were when GridSheet.rows was replaced later or a snapshot was restored.
  • Changed a modified row whose data is back to its original values (a cell typed back, or a formula result recomputed after its input was undone) to become unmodified again and leave changes.modified, like dirty tracking in form libraries. Typing a new formula still keeps the row modified.
  • Changed GridSheet.evaluator and GridSheetCellContext.evaluator to the new GridSheetEvaluator interface (evaluate(String expression, Map context)), so the expressions package's types are no longer part of the API. GridSheetExpressionEvaluator implements it instead of extending ExpressionEvaluator; GridSheetCellContext's default evaluator is now the null-safe one.
  • Removed GridSheetManager.cleanup(). The grid releases its resources when it's disposed; calling it while the grid was on screen disposed controllers the grid still used.
  • Removed the unused CellValueChanged typedef, GridSheetCellWidgetType enum and GridSheetSortKey class.
  • Stopped exporting internal classes: the formula engine, GridSheetAutoFillEngine, GridSheetFillDirection, GridSheetColumnGroups, GridSheetSorter, GridSheetCellSelectionState, GridSheetRowExpansionForm, RowExpansionLayout, GridSheetEvaluatedFormatCache, GridSheetNoScrollbarBehavior, NegativeKeyGenerator and the pagination state class.
  • Removed deprecated APIs: GridSheetLayoutConfiguration, layoutConfiguration, reorderColumnsByOrder, freezeColumnsUptoKey, freezeColumnsUptoIndex, GridSheetColumn.frozen, GridSheetColumnGroups.frozen, GridSheetColumnContextInfo.isFrozen, GridSheet.onCellValueChange, GridSheetConfiguration.enableReorder/rowHeight/serialNumberColumn/serialNumberColumnWidth, GridSheetDynamicTableGeneration.type/width/rowState and exportToCSV(onlyCurrentpageRows:).
  • Changed manager calls to do nothing when their GridSheetConfiguration flag is off, like the UI (e.g. rows.setHeights needs enableRowResize).
  • Changed rows.resetOrder() and columns.setWidths() to return Future<void>.
  • Changed cell text to not wrap by default (GridSheetColumn.wrap defaults to false).
  • Changed GridSheetCellValueChangedEvent.newValue to the stored, typed value instead of its string form.
  • Changed GridSheetFormConfiguration.formBuilder to replace only the card's content.
  • Changed columns.insert/columns.duplicate to always insert into the scrollable section.
  • Changed a conditional format rule with a textStyle but no expression to apply to every cell it covers.
  • Changed GridSheetRow.index on server-side pages and infinite-scroll batches to the row's position in the grid.
  • Changed the default GridSheetStyleConfiguration.rowDragFeedbackElevation from 4.0 to 8.0.
  • Changed the table row drag preview to a compact one: the row's values on one ellipsized line, at the row's own height.
  • Moved the horizontal scrollbar below the pinned-bottom rows, to the grid's bottom edge.
  • Changed autofill to start a fill drag only from the visible fill handle when enableCellSelection is on.
  • Changed editable table cells to mount a TextField only while being edited; other cells draw the same box and text.

New Features #

  • Made GridSheetManager a Listenable: listeners added with addListener are called once after each frame that changes the grid (data, selection, sort, filters, page, layout or view), so it works with ListenableBuilder.
  • Added pinned rows: GridSheetRow.pinnedTop/pinnedBottom, rows.pin/pinTo/unpin/unpinAll/pinnedTop/pinnedBottom, reordering within a band, and selection, conditional format, autofill and style options for pinned rows.
  • Added row visibility: GridSheetRow.visible and rows.hide/show/showAll/hidden.
  • Added row swipe (GridSheet.rowSwipeConfiguration) with per-side reveal strips, hold-open actions, full-swipe callbacks and per-row canSwipe.
  • Added GridSheetRowSwipeExclusion to keep a cell widget's own horizontal drag (e.g. a Slider) in a swipeable row.
  • Added row and column grouping (GridSheet.groupingConfiguration).
  • Added pivot tables (GridSheet.pivotConfiguration, GridSheetViewMode.pivot) with totals, subtotals, averages, header sorting, drill-down (GridSheet.onPivotCellTapped) and gridManager.pivot.
  • Added server-side pivot tables with GridSheet.onPivotRequest.
  • Added pivot selection and copy (pivot.selection, pivot.copyToClipboard), conditional formatting (pivot.formatting), column widths and hiding, and the pivot state in snapshots.
  • Added row separators: GridSheet.rowSeparatorBuilder and GridSheetRowSeparator.
  • Added GridSheet.rowDragPreviewBuilder and GridSheetFormConfiguration.cardDragPreviewBuilder to customize the row and card drag previews.
  • Added an exact-size dotted drop gap for row, form card and column drag-and-drop.
  • Added dropping a row after the last row of its section.
  • Added GridSheetDashedBorder, a dashed or dotted BoxBorder usable in any BoxDecoration.
  • Added GridSheetFormConfiguration.cardWrapper.
  • Added reordering within pinned column panes (enableReorderOnPinnedLeftColumns/enableReorderOnPinnedRightColumns).
  • Added GridSheetColumn.wrap and columns.setWrap.
  • Added focused-cell tracking: cursor.row, cursor.column and cursor.cell.
  • Added rows.count, columns.count, rows.at/atIndexes, columns.at/atIndexes, rows.findAll, columns.findAll and columns.findByNames.
  • Added columns.hidden, columns.showAll, columns.pinTo, columns.unpin, columns.resetWidths and GridSheetColumn.resetWidth.
  • Added GridSheetConfiguration.showBottomBarBorder.
  • Added full-width row expansion across pinned and scrollable columns.
  • Added text-only conditional formatting: an expression can return true to apply only textStyle.
  • Added date comparisons and a _today variable to expressions.
  • Added GridSheetSnapshot.formulas, so restoring a snapshot rebuilds its formulas.
  • Added debug warnings when GridSheet.rows/columns change after mount, and when a cell-scoped rule's name matches no column.
  • Improved client-side sorting about 10× on large grids.
  • Improved filter, search, select-all, formula refresh, column auto-fit and formatting.styles performance on large grids.
  • Improved conditional formatting to evaluate a row rule once per row when it doesn't use per-cell variables.
  • Improved horizontal scrolling to build only the cells scrolling into view.
  • Improved vertical scrolling to stop rebuilding row expansion panels and separators every frame.
  • Improved keyboard navigation and the autofill preview on large grids.
  • Improved infiniteScroll to process only newly fetched rows.
  • Improved cell build cost.
  • Improved scrolling with editable columns about 4× by not mounting a TextField in every cell.
  • Improved memory use on large grids: rows create rebuildNotifier on first use.
  • Improved refreshes to reuse rowSeparatorBuilder heights until rows change or notifyListeners is called.
  • Improved scrolling: one shared scroll position per axis, and each row built once instead of once per pane.
  • Added GridSheetScrollbar and the external scrollbar placements, to place the table's scrollbars anywhere in the app's layout.

Bug Fixes #

  • Fixed a tap on a data cell not selecting it (read-only, editable, wrapped and custom cells alike), and the pivot drill-down reacting to right-clicks.
  • Fixed a "ValueNotifier was used after being disposed" error, and rows no longer repainting, when the same GridSheetRow objects are shown in a GridSheet again after the previous one was disposed.
  • Fixed the fill handle staying on the old bottom-right cell after a sort, reorder or pin moved the selected rows or columns.
  • Fixed leaving a formula cell without changing it marking the row modified (and flashing the cell).
  • Fixed GridSheetRow.originalData holding the new value instead of the old one when a formula result changed (on leaving the cell, or when a dependent formula was recalculated).
  • Fixed a row that was edited and then deleted being reported in both changes.modified and changes.deleted; it's now only in changes.deleted.
  • Fixed changes.undoAll() dropping rows deleted for good from changes.deleted without bringing them back, so an app saving from changes never deleted them. Such rows now stay in changes.deleted (a deletion can only be undone while its undo window is open), as with changes.undo(keys).
  • Fixed a page size below 1 breaking pagination: pagination.setRowsPerPage(0) hid every row, and a negative size made every read of the current page throw. setRowsPerPage now throws an ArgumentError for such a size and leaves the pagination unchanged, and a GridSheetConfiguration with pagination on (the default) asserts rowsPerPage is at least 1.
  • Fixed a column renamed through GridSheet.columns (same key, new name) losing its filter, and keeping a sort that was reported but no longer applied; it now keeps both, as with columns.rename.
  • Fixed swapping two columns' names in one columns.rename call moving one column's filter, sort, comparator and width onto the other and losing the other's.
  • Fixed deleting the sorted column leaving its sort active: nothing could clear it from a header, it blocked row reordering, and server requests kept sorting by it. The sort is dropped once the deletion is final (an undo still restores it), and the rows keep their order.
  • Fixed rows whose formula result changed being listed in changes.modified only if they were on the current page: results on other pages, computed when their page is shown, didn't mark their rows modified or keep their original data.
  • Fixed filtering, searching and sorting by a formula column using out-of-date results for rows off the current page after an edit.
  • Fixed a formula column inserted with a formula default (e.g. columns.insert([...], defaultValues: ['=A*2'])) showing wrong results such as #CIRCULAR! and never recalculating: it was evaluated at the wrong column and its formula wasn't registered.
  • Fixed changes.undo on a row edited before its columns were reordered, inserted or deleted putting values in the wrong columns, or throwing after an insert: the row's original data now follows the column layout.
  • Fixed a new GridSheet.rows list whose changed row happened to hash the same as before being taken for no change, leaving the old data shown: rows are now compared exactly.
  • Made selection.containsRow, containsColumn and containsCell constant-time instead of copying and scanning the selection on every call.
  • Fixed a failing first-page fetch on mount (onPageChange with no initial rows) being an unhandled error; it's now reported to onError (GridSheetErrorSource.pageChange).
  • Fixed an exception in cellBuilder breaking the grid's build; it's now reported to onError (GridSheetErrorSource.cellBuilder) and the default cell is shown.
  • Fixed the hovered row staying hovered after enableRowHover is turned off at runtime.
  • Fixed rows.insert with no selection under client-side pagination inserting at the wrong position.
  • Fixed columns.insert with no selection and columnInsertPosition: before doing nothing.
  • Fixed infiniteScroll not showing the loading indicator while a page is fetched.
  • Fixed GridSheetRow.isSelected getting out of sync with the grid's selection.
  • Fixed a row created with isSelected: true showing as unselected.
  • Fixed conditional formatting showing a deleted or inserted column's style on its neighbor.
  • Fixed conditional formatting not updating for recalculated formula cells.
  • Fixed cell-scoped conditional format rules not following a column rename.
  • Fixed a cell-scoped rule on a pane's first column also coloring the row background.
  • Fixed conditional formatting skipping a column with both pinnedLeft and pinnedRight when only conditionalFormatIncludesPinnedRightCells was on.
  • Fixed conditional formatting in the form layout showing text styles but no backgrounds.
  • Fixed an invalid expression logging an error for every cell on every refresh.
  • Fixed pasting and findAndReplace storing values as text in typed columns.
  • Fixed GridSheetDataSource.rowsFromJson and toParsedDataMap turning lists, maps and objects into null.
  • Fixed the (Blanks)/(Non-Blanks) filters treating empty lists and maps as non-blank.
  • Fixed selection.cellsData keeping duplicate list, set and map values.
  • Fixed cells.copyToClipboard(includeHeaders: true) placing headers over the wrong columns.
  • Fixed CSV export writing negative numbers as text, and hardened it against formula injection.
  • Fixed cells.value, cells.values and data exports returning stale formula results for rows on other pages.
  • Fixed on-screen formula cells not recalculating after rows were inserted or deleted.
  • Fixed undoing a row delete on a later server-side page restoring the row at the wrong position.
  • Fixed snapshots.restore breaking formulas after rows were sorted, inserted or deleted.
  • Fixed snapshots.restore keeping selected rows, columns and cells that aren't in the snapshot.
  • Fixed a server-side page change keeping the expanded state and change flash of unloaded rows.
  • Fixed columns.rename leaving an open context menu showing the old name.
  • Fixed columns.resetOrder using the latest GridSheet.columns instead of the original order.
  • Fixed the GridSheetRowReorderEvent.toIndex docs: it's the insertion index before the move, like ReorderableListView.onReorder.
  • Fixed read-only cells' focus nodes leaking while scrolling.
  • Fixed the text-measuring cache growing without limit.
  • Fixed conditional-format results being kept for every row ever formatted.
  • Fixed infiniteScroll adding rows whose key is already loaded; they're now skipped.
  • Fixed repeated row keys going undetected; they now fail an assertion in debug builds.
  • Fixed infiniteScroll refetching forever when a fetch adds no rows.
  • Fixed the pinned panes drifting out of line after an overscroll bounce on iOS and macOS.
  • Fixed row expansion panels and separators covering the scrollbars, and sitting on the wrong side in RTL.
  • Fixed cell navigation on desktop and web selecting the whole text instead of placing the caret.

2.2.3 #

New Features #

  • Added GridSheetManager.isRowHovered/hoveredRowKey for querying row-hover state from a custom cellBuilder.
  • Added GridSheetCellContext.columnSortState, exposing a header cell's current sort direction.

2.2.2 #

Bug Fixes #

  • Fixed stretchColumnsToFillWidth never shrinking columns back down after growing.
  • Fixed gridBorderRadius corners rendering square where header/row backgrounds met the border.
  • Fixed the undo-delete toast's countdown timer not resetting on a second deletion.
  • Fixed unselected form-view cards rendering with square corners.

New Features #

  • Added RTL support to the card-based form layout.
  • Added lazy, windowed rendering for enableGridView's masonry columns.
  • Changed the undo-delete toast's countdown to a CircularProgressIndicator with a numeric countdown.
  • Added GridSheetStyleConfiguration.footerRowBorderColor.
  • Added a drag_indicator icon on row hover in the index cell when row reorder is enabled.

2.2.1 #

Breaking Changes #

  • Changed between/notBetween filters to use the .. delimiter (e.g. '10..50') instead of the previous dash-based format.
  • Changed addFilters's default comparison from GridSheetFilterComparison.contains to .auto, so unparenthesized values containing >, <, !, %, .., or a leading = are now reinterpreted as typed-operator syntax unless comparison is passed explicitly.
  • Renamed GridSheetFilterComparison.notEqual to notEquals.

Bug Fixes #

  • Fixed pooled cell controllers and focus nodes being disposed while gestures were still active.
  • Fixed GridSheetControllerPool leaking focus nodes for read-only cells.
  • Fixed auto-reload overlapping requests and added exponential backoff after consecutive failures.
  • Fixed auto-reload errors not being reported through GridSheet.onError.
  • Fixed onAfterReload being called after a grid was disposed.
  • Fixed exceptions from host callbacks interrupting grid operations.
  • Fixed expression caches being shared between GridSheet instances.
  • Fixed GridSheet.noRowsWidget layout and positioning issues.
  • Fixed the noRowsWidget overlay swallowing horizontal scrollbar drags by reserving its bottom gutter.
  • Fixed contextMenuWidget crashing when invoked for the index column.
  • Fixed horizontal scroll windowing not updating when GridSheet.indexColumn changed.

New Features #

  • Added GridSheet.formConfiguration for responsive card-based form layouts with optional multi-column grids and customizable card builders.
  • Added independent header and filter row border configuration.
  • Improved pagination controls to scroll horizontally when they do not fit the available width.
  • Added cross-column search with search(), clearSearch(), activeSearchItems, and searchExactMatchCase.
  • Added smart search syntax support for filter operators such as >100, 10..50, !apple, and app%.
  • Added && and || support for combining multiple filter values.
  • Added GridSheetManager.autoReloadFailureCount to track consecutive auto-reload failures.
  • Added GridSheetPagination.showGoToPage for direct page navigation.
  • Added GridSheetFilterComparison.auto for automatic filter operator parsing.
  • Added GridSheetDataHelpers.parseFilterSyntax to parse typed-operator syntax (>100, 10..50, !apple, app%, etc.) out of a raw filter string, for server-side search/filter parity.
  • Updated row reorder and resize behavior to work without requiring GridSheet.indexColumn.
  • Extended enableRowSelectionOnFirstColumnTap to fall back to the first visible data column when GridSheet.indexColumn is hidden or pinned right.
  • Added precedence handling between enableRowContextMenu and enableCellContextMenu.

2.2.0 #

Breaking Changes #

  • Added isSelected to GridSheetRowWrapper callbacks, to expose row-level selection state based on GridSheetManager.selectedRowKeys rather than individual cell selection.
  • Deprecated GridSheetConfiguration.serialNumberColumn and serialNumberColumnWidth; use GridSheet.indexColumn instead.
  • Deprecated GridSheetDynamicTableGeneration.type and width; use columnBuilder and rowBuilder to customize generated columns and rows.

Bug Fixes #

  • Fixed built-in and custom select-all header checkboxes not updating when row selection changes through individual row taps.
  • Fixed GridSheetManager.filters exposing the mutable internal filter map by returning an unmodifiable view instead.
  • Fixed getSelectedRows() and getSelectedColumns() rebuilding full lookup maps on every call by reusing the existing row and column indexes.
  • Fixed column reordering leaving stale context menus and filtered-row caches by resetting both after reorderColumnsByPositions(), setColumnOrderByNames(), and resetColumnOrder().
  • Fixed fillCells() triggering redundant formula recalculations against partially filled data by batching formula-dependent recalculations.
  • Fixed createSnapshot() sharing dropdownOptions lists with live columns by copying the lists when creating snapshots.
  • Added CellAuditTrail to the package's public exports alongside the existing CellChangeRecord export.

New Features #

  • Added full RTL support through GridSheetDirection, including mirrored column layout, alignment, borders, scrolling, virtualization, resizing, drag operations, pagination controls, expansion indicators, sorting icons, and reading-start/reading-end pinning.
  • Added configurable GridSheet.indexColumn, replacing the deprecated serialNumberColumn and serialNumberColumnWidth properties with a single GridSheetColumn? supporting title, width, pinning, alignment, and visibility configuration.
  • Added GridSheetColumn.showOverflowTooltip for opt-in per-column overflow hover tooltips, reducing unnecessary text-overflow measurement costs.
  • Added dynamic table customization through GridSheetDynamicTableGeneration.columnBuilder and rowBuilder, allowing generated columns and rows to override their properties while retaining generator-managed keys and indexes.
  • Added undo-delete support for row and column deletions through GridSheetConfiguration.enableUndoDelete, built-in and custom undo prompts, and GridSheetUndoDeleteEvent callbacks.
  • Extended GridSheetCellContext.onToggleRowExpansion and isRowExpanded to all row cells when row expansion is enabled, allowing custom cells to provide their own expansion controls.
  • Added configurable pinned-column dividers through GridSheetStyleConfiguration.pinnedLeftDividerColor, pinnedRightDividerColor, and pinnedColumnsDividerWidth, rendered between panes without overlaying active cell content.

2.1.0 #

Breaking Changes #

  • Changed GridSheetRow.data to an unmodifiable view to prevent mutations that bypass change tracking and formula dependency updates; use GridSheetManager.setCellAt or updateRowByKey instead.
  • Changed GridSheetRow.height to a read-only getter to prevent direct mutations from desynchronizing visual row heights from the virtualized layout; use the provided row-height manager APIs instead.
  • Added the isPinnedRight parameter to GridSheetHeaderWrapper, GridSheetFilterWrapper, and GridSheetRowWrapper callbacks, requiring existing callbacks to accept the new parameter.
  • Changed enableCellNavigation Left/Right arrow keys to clamp at the first/last column instead of wrapping between rows, while Tab/Shift+Tab retain row wrapping and Left/Right during text editing control the cursor instead of cell navigation.

Bug Fixes #

  • Fixed updateRowHeights() and updateRowHeightsByKeys() updating model heights without visually resizing the corresponding rows.
  • Fixed autofillVerticalCells() and autofillHorizontalCells() ignoring supplied sourceValues by seeding source cells with the provided values before extrapolation.
  • Fixed stale column widths returned by findColumnByKey(), findColumnByName(), and getColumnWidths() after auto-fit or drag-resizing by rebuilding the cached column index after width changes.
  • Fixed virtualized arrow-key and Enter navigation failing for cells outside the current build window by scrolling targets into the built range before requesting focus.
  • Fixed keyboard navigation selecting the destination cell when enableCellSelection is enabled; navigation now moves focus without changing selection.
  • Fixed the pinned-right boundary border rendering above selected or hovered row highlights by moving it into the pane's first-column cells to share the pinned-left overlay stack.
  • Fixed clearPinColumns() and similar column moves causing setState()/markNeedsBuild() errors by deferring column-virtualization range recalculation until the next frame.
  • Fixed the pinned-right boundary border disappearing when horizontal overflow is absent by suppressing the trailing scrollable-column border only when overflow actually exists.

New Features #

  • Added GridSheet.onError, GridSheetErrorEvent, and GridSheetErrorSource for routing internally handled failures to custom error-reporting systems instead of debugPrint.
  • Added Sliver-backed row virtualization to build only rows within or near the viewport, enabling smooth scrolling with 100K+ rows while keeping widget counts bounded.
  • Added column virtualization for scrollable non-pinned columns, significantly improving performance for wide schemas with hundreds of columns.
  • Added full row-expansion support for virtualized rows, including virtualized expand/collapse animations.
  • Updated editable cells to support multiline text when row heights increase through resizing or auto-fit APIs while preserving Enter-to-next-row navigation.
  • Added right-pinned columns via GridSheetColumn.pinnedRight, including manager APIs, pinned-right selection/conditional-format support, and a dedicated non-virtualized pane before the scrollbar.
  • Rebuilt enableCellNavigation with dedicated Shortcuts/Actions bindings so Tab/Shift+Tab follow logical order across pinned/hidden columns, Shift+Enter moves upward, and read-only cells remain keyboard-selectable.
  • Added GridSheet.noColumnsWidget to display a configurable empty state when all real columns are hidden, excluding the synthetic serial-number column from the visibility check.

2.0.4 #

Bug Fixes #

  • Fixed the cell editor border using row border styling instead of its own configuration.
  • Fixed header and cell overflow tooltips not attaching correctly in some cases.
  • Updated hoverColorOnRow to match selectionColor behavior when showBorderOnSelection is enabled.
  • Fixed the row expansion panel width to match the grid's rendered width instead of the window width, preventing overflow and right-edge gaps.
  • Fixed the row expansion panel scrollbar overlapping the last column by reserving scrollbar space.

New Features #

  • Added context menu appearance configuration (elevation, radius, background, and backdrop dimming).
  • Added custom builders for reveal animations and cell flash effects.
  • Added customizable auto-fill handle shape and border radius.
  • Added a custom scrollbar builder and independent horizontal/vertical scrollbar visibility.
  • Added vertical scrollbar placement options (afterLastColumn or overlay).
  • Added configurable resize handle color and thickness.
  • Added configurable drag feedback elevation and opacity.
  • Added independent cell editor border color and width.
  • Added stretchColumnsToFillWidth to expand columns and fill available width.
  • Added maxStretchWidth to limit how much individual columns can stretch.
  • Redesigned and improved the row expansion panel layout with responsive field wrapping that adapts continuously to the available width.

2.0.3 #

Bug Fixes #

  • Fixed serial numbers resetting on each server-side pagination page instead of continuing across pages.
  • Fixed numeric input formatters clearing cells when entering decimals or negative values.
  • Fixed createSnapshot()/restoreSnapshot() losing filtered rows, undo baselines, and formula state.
  • Fixed insertRows(), deleteRowsAt(), and updateRowHeights() using incorrect row positions with client-side pagination.
  • Fixed between and notBetween filters failing with negative values.
  • Fixed corrupted pagination state causing duplicate rows after a failed infiniteScroll reload.
  • Fixed incorrect serialization of conditional-format fontWeight values in getConditionalFormattingStyles().
  • Fixed animationConfiguration, conditionalFormatRules, and evaluator not updating after GridSheet rebuilds.
  • Fixed the context menu remaining open after row/column changes, sorting, filtering, or reloads.
  • Fixed GridSheetRow.copyWith() losing the original row height, breaking resetHeight().
  • Fixed findAndReplace counting matches in read-only and non-editable cells.
  • Fixed parseHexColor incorrectly parsing 3-digit shorthand hex colors.
  • Corrected GridSheetRow documentation to prevent corrupting the undo baseline.

2.0.2 #

  • Added a live demo page to showcase GridSheet features and capabilities.
  • Added GridSheetConditionalFormatRule.stopIfTrue to support Excel-style "Stop If True" behavior. When enabled on a matching rule, lower-priority conditional formatting rules are ignored for that cell.
  • Added GridSheetManager.reorderConditionalFormatRulesByPositions to allow changing conditional formatting rule priority after rules have been added.
  • Added the atIndex parameter to addConditionalFormatRule to insert a new conditional formatting rule at a specific priority position instead of adding it at the end.
  • Renamed the GridSheetCellValueChangedEvent.columnName property to name for improved clarity and consistency.
  • Added the title property to GridSheetCellValueChangedEvent to provide additional cell context.
  • Added support for preserving conditional formatting styles when generating exports GridSheetManager.getConditionalFormattingStyles.
  • Fixed duplicate column border rendering in tables when showColumnBorders is enabled with frozen and active columns.

2.0.1 #

Bug Fixes #

  • Fixed formula dependency synchronization after structural changes.
  • Fixed formula undo history after row and column operations.
  • Fixed autofill corruption after sorting and structural modifications.
  • Fixed incorrect numeric autofill pattern detection.
  • Fixed selection rendering with pinned-left and serial-number columns.
  • Fixed hover synchronization across pinned and scrollable sections.
  • Fixed hidden columns retaining stale selection state.
  • Fixed stale selection and expanded-row state after reloads.
  • Fixed duplicated rows sharing mutable data.
  • Fixed stale cell listeners after column insertions and deletions.
  • Fixed row disposal idempotency.
  • Fixed context menu visibility logic.
  • Fixed runtime type errors when assigning null to mixed-type data.
  • Fixed LEFT, RIGHT, and MID throwing RangeError.
  • Improved JSON import validation with descriptive errors.
  • Fixed multiple rendering, pagination, caching, rebuild, documentation, and compatibility issues.
  • Fixed formula-column insertion without matching defaultValues.
  • Secured CSV exports against formula/DDE injection.
  • Fixed stale infinite-scroll responses merging after reloads.
  • Fixed exportToCSVWithFormulas(includeFormulas: true) exporting evaluated values instead of formulas.
  • Fixed initial auto-fetch when using infiniteScroll without serverSidePagination.

2.0.0 #

Breaking Changes #

  • deleteRowsAt/deleteRowsByKeys now return Future<List<ValueKey<String>>> instead of Future<int>.
  • Renamed GridSheetLayoutConfiguration to GridSheetConfiguration (deprecated alias provided).
  • Renamed GridSheetgridManagerHelpers to GridSheetManagerHelpers.
  • Deprecated GridSheetConfiguration.rowHeight; use GridSheetRow.height for per-row heights.

New Features #

  • Added configurable staggered slide-in animation via GridSheetAnimationConfiguration (GridSheet.animationConfiguration).
  • Slide-in animation now automatically replays after pagination changes.
  • Added animateRowsOnSortOrFilter to animate row slide-in after sorting and filtering.
  • Row slide-in animation now supports server-side pagination and infinite scroll when enabled.
  • Added configurable cellChangeFlashEnabled animation for edited or recalculated cells.
  • Added columnVisibilityFadeEnabled for smooth column show/hide width and opacity transitions.
  • Added insertRows and insertColumns APIs with configurable insertion positions.
  • Added defaultValues support for insertRows and insertRowsAt.
  • Added refreshAllFormulas; CSV exports now refresh formulas automatically before exporting.
  • Added selectionIncludesPinnedLeftCells and conditionalFormatIncludesPinnedLeftCells.
  • Added showOnlyEditableColumns to row expansion configuration.
  • Added pinColumnsToLeft, clearPinColumns, pinnedLeftColumns, and activeColumns.
  • rowStateColorBuilder, rowStateIconBuilder, and sortIconBuilder can now return null.
  • Added GridSheetRow.resetHeight to restore a row's original height.
  • Added GridSheetManager.getCellFormula to retrieve a cell's raw formula.
  • Added onlyCurrentPageRows to exportToCSV.

Performance Improvements #

  • Optimized formula recalculation to update only dependent formulas.
  • Improved formula initialization by avoiding unnecessary dependency graph copies.
  • Replaced recursive circular-reference detection with an iterative implementation.
  • Optimized bulk row deletion with a single-pass algorithm.
  • Eliminated unnecessary full-grid rebuilds during column resizing.
  • Reduced selection border rendering overhead.
  • Optimized overflow tooltip detection using cached text measurements.

Improvements #

  • Formula dependency graphs now stay synchronized after structural changes.
  • GridSheetConfiguration now updates automatically on parent rebuilds.
  • Improved server-side pagination by ignoring stale overlapping requests.
  • Added graceful handling for failed server-side page requests.
  • Improved built-in row expansion and row selection interaction.
  • selectColumnAcrossAllPages now correctly affects selected-column APIs.
  • resetAllRowHeights now restores each row's original height.

API Changes #

  • Added APIs for programmatic pinned-column management.
  • Renamed freezeColumnsUptoIndex to pinColumnsLeftUptoIndex (deprecated alias retained).
  • Deprecated freezeColumnsUptoKey in favor of pinColumnsLeftUptoIndex.
  • Renamed GridSheetColumn.pinnedLeft to pinnedLeft (deprecated alias retained).
  • Renamed GridSheetColumnContextInfo.isFrozen to isPinnedLeft (deprecated alias retained).
  • Renamed GridSheet.onCellValueChange to onCellValueChanged (deprecated alias retained).
  • Fixed exportToCSV.onlyCurrentpageRows typo (onlyCurrentPageRows is now canonical).
  • Deprecated GridSheetConfiguration.rowHeight in favor of GridSheetRow.height.
  • Renamed GridSheetgridManagerHelpers to GridSheetManagerHelpers.
  • Renamed Token/TokenType to GridSheetFormulaToken/GridSheetFormulaTokenType (deprecated aliases retained).
  • Restored deprecated compatibility shims for enableReorder and reorderColumnsByOrder.

Default Changes #

  • Changed default rowsPerPage from 50 to 30.
  • Changed default grid border radius from 4px rounded to square.

1.3.1 #

  • Added row expansion feature support — to expand an inline sub-panel (a child table, a form, extra fields).
  • Added new property description in GridSheetColumn — useful for abbreviated column names descriptions.
  • Added manual and scheduled auto-reload with reload callbacks and runtime controls.
  • Added rowsLoader for refreshing client-side data without rebuilding.
  • Added updateConfiguration for updating non-structural layout settings at runtime.
  • Added cell tooltip on overflow — when cell text is truncated, show a tooltip on hover with the full value.
  • Fixed reload lifecycle, auto-reload scheduling, and error handling.
  • Fixed rows-per-page sync and infinite-scroll reload rollback.
  • Fixed missing fields in GridSheetLayoutConfiguration (copyWith, equality, hashCode, and toString).
  • Fixed evaluateFormula return type.
  • Fixed fillCells(increment: true) correctly incrementing numeric values.

1.3.0 #

  • Added server-side (lazy pagination), infinity-scroll paginations feature support
  • Added row-reordering feature support
  • Added cell type GridSheetColumnType.dropdown — built-in dropdown/select cells feature support
  • Renamed enableReorder property to enableColumnReorder
  • Renamed reorderColumnsByOrder method to reorderColumnsByPositions
  • Fixed performance issue when switching theme.
  • Fixed cell level conditional format issue when reordering columns

1.2.9 #

  • Optimized internal code for better overall performance and stability
  • Fixed minor bugs

1.2.8 #

  • Optimized internal code for better overall performance and stability
  • Added row resize functionality
  • Added Unique Count aggregation
  • Added support of showColumnHeaderRow option in layoutConfiguration
  • Added support of ascSortIconColor, descSortIconColor options in styleConfiguration

1.2.7 #

  • Enhanced Pagination
  • Optimized code and improved performance

1.2.6 #

  • Added support of column level aggregations
  • Fixed some issues

1.2.5 #

  • Performance Optimization
  • Added support of new option filterPosition in GridSheetConfiguration
  • Fixed some issues

1.2.4 #

  • Refactor: replace expression style fields with static-based text style BREAKING CHANGE: removed textStyleExpression — use textStyle instead

1.2.3 #

  • Refactor: replace static color/style fields with expression-based conditional formatting API BREAKING CHANGE: removed expression, backgroundColor, fontStyle — use backgroundColorExpression and textStyleExpression instead

1.2.2 #

  • Added dynamic table generation: tables can now be generated at runtime based on columnsCount and rowsCount.
  • Added renameColumns method: allows renaming of column names and optional titles.

1.2.1 #

  • Refactored internal auto-fill logic to reduce code duplication and improve maintainability.
  • Added loadingOverlayColor option in styleConfiguration

1.2.0 #

  • Provided support of autofill(cell drag-to-copy) feature.

1.1.9 #

  • Fixed Undo Feature issue with formula type columns

1.1.8 #

  • Fixed issues related to formula type
  • Added ISBLANK, ISNUMBER, ISTEXT formula functions

1.1.7 #

  • Updated example to demonstrate light and dark theme support
  • Provided support of formula type cell feature.

1.1.6 #

  • Added default norowswidget

1.1.5 #

  • Added issue_tracker link in pubspec file

1.1.4 #

  • Updated package description within pub.flutter-io.cn limits

1.1.3 #

  • Updated example with latest code

1.1.2 #

  • Fixed select all issue

1.1.1 #

  • updated license

1.1.0 #

  • Added row on hover feature.
  • Added headerWrapper feature.
  • Added filterWrapper feature.
  • Added rowWrapper feature.

1.0.5 #

  • Added sample example.

1.0.4 #

  • Removed prints.

1.0.3 #

  • Removed theming classes.

1.0.2 #

  • Removed unrequired classes.

1.0.1 #

  • Removed unrequired passages.

1.0.0 #

  • Initial release of GridSheet.
  • Added row and column operations.
  • Added sorting, filtering, pagination, and selection support.
4
likes
160
points
228
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A powerful Flutter DataGrid/DataTable for large datasets, offering Excel-like features and fully customizable cells — ready with minimal setup. See README for full features

Homepage
View/report issues

Topics

#data-table #data-grid #table #excel #spreadsheet

License

MIT (license)

Dependencies

expressions, flutter

More

Packages that depend on grid_sheet