grid_sheet 3.0.0
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.rowsandGridSheet.columnsnow 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
GridSheetManagermembers by area:rows,columns,cells,selection,filters,search,sorting,pagination,formatting,formulas,data,changes,config,cursor,loading,autoReloadandsnapshots.gridManager.rows/columnsare no longer lists; userows.all/columns.all. - Removed the index- and name-based manager methods; rows and columns are addressed by
ValueKey<String>. Userows.at,columns.atorcolumns.findByNamesto get a key. - Dropped the
ByKeys/ByKeysuffixes andgetprefixes (e.g.selectRowsByKeys→selection.selectRows,getSelectedRows()→selection.rows). - Replaced the
onlyFilteredRows/onlyCurrentPageRows/onlyVisibleColumnsflags withGridSheetRowScopeandGridSheetColumnScope. - Changed
sorting,filters,data.statistics,data.groupBy,columns.setWidths/widths/rename,cells.find/findAndReplaceandGridSheetCellContext.onFilterChangedto 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
positionparameter ofrows.insert/columns.insert; placement comes fromrowInsertPosition/columnInsertPosition.rows.insertAt/columns.insertAttake a target key. - Renamed
GridSheetRowInsertPosition.aboveSelection/belowSelectiontoabove/below, andGridSheetColumnInsertPosition.beforeSelection/afterSelectiontobefore/after. - Changed
GridSheetSortStateto take named arguments and carry the columnkey; renamedcolumnNametoname. - Changed
GridSheetColumnTypefrom an enum to constructors (e.g.GridSheetColumnType.text()), checked withtype.kind;dropdownOptionsandshowFormulaInEditmoved intodropdown(options:)andformula(showFormulaOnFocus:). - Changed
headerWrapper,filterWrapperandrowWrapperto receive a details object with the grid manager. - Merged
rowStateColorBuilderandrowStateIconBuilderintorowStateIndicatorBuilder, which returns aGridSheetRowStateIndicatorwith an optionalcolorandicon. TheGridSheetRowStateColorBuilder/GridSheetRowStateIconBuildertypedefs are replaced byGridSheetRowStateIndicatorBuilder. - Renamed
rowExpandedWidgetBuildertorowExpandedBuilderand addedgridManagerto it. - Added
contextandgridManagertoGridSheetFormConfiguration.topBarBuilder/bottomBarBuilder(formerlyheaderBuilder/footerBuilder), which now take(context, row, gridManager).GridSheet.topBarBuilder/bottomBarBuilderstill take(gridManager). - Renamed
GridSheetparameters:contextMenuWidget→contextMenuBuilder,headerWidget/footerWidget→topBarBuilder/bottomBarBuilder,undoDeleteWidget→undoDeleteBuilder,noRowsWidget/noColumnsWidget→emptyRowsPlaceholder/emptyColumnsPlaceholder,loadingWidget→loadingIndicator,autofillConfiguration→autoFillConfigurationandtableGenerationConfiguration→dynamicGenerationConfiguration. - Replaced
GridSheetDynamicTableGenerationwithGridSheetDynamicGenerationConfiguration, withoutenabled.GridSheet.dynamicGenerationConfigurationis now nullable. - Renamed
GridSheetConfiguration.selectOnlyPageRowstoselectOnlyCurrentPageRows, andfilterBlanksText/filterNonBlanksTexttoblanksText/noBlanksText. - Renamed
GridSheetConstants.filterBlanksText/filterNoBlanksTexttoblanksText/noBlanksText. - Moved
GridSheetFormConfiguration.modetoGridSheet.viewMode, and renamedGridSheetFormConfiguration.headerBuilder/footerBuildertotopBarBuilder/bottomBarBuilder. The oldautomode is nowGridSheetViewMode.responsive. - Renamed
GridSheetStyleConfiguration.ascSortIconColor/descSortIconColortoascendingSortIconColor/descendingSortIconColor, andfooterRowBorderColortobottomBarBorderColor. - Renamed
GridSheetColumn.resizetoresizable, and replacednoTextControllerWidgetwithhasTextController(inverted, defaults totrue). - Renamed
IGridSheetCustomCellWidgetBuildertoIGridSheetCustomCellBuilder, and theGridSheetCustomCellWidgetBuildertypedef (the type ofGridSheet.cellBuilder) toGridSheetCellBuilder. - Removed the public
GridSheetState.refresh(). UsenotifyListeners()to rebuild the grid after state it reads changed outside of it. - Changed
onLoaded,onRowsSelected,onColumnsSelected,onCellsSelected,onCellValueChanged,onColumnReorderandonRowReorderto returnvoid, like the other callbacks. The grid never used their return value. - Renamed
GridSheetConditionalFormatRule.backgroundColorExpressiontoexpression, and removedGridSheetFormatScope.column(usecell). - Renamed the expression variables
row_state,cell_value,column_nameandcolumn_indexto_row_state,_cell_value,_column_nameand_column_index. - Renamed
searchExactMatchCasetosearchExactMatchonGridSheetPageRequestandGridSheetSnapshot. - Made
GridSheetCellContext.gridManagernon-nullable. - Made
GridSheetRow.originalDataread-only and removed it from the constructor andcopyWith. - Removed
GridSheetRow's bookkeeping methods (markAsInserted,markAsModified,markAsDeleted,setDataAt,replaceData,setHeight,resetHeight,mutableDataForInternalUse,formatCacheForColumn,clearFormatCache,dispose). Use the manager instead. - Removed the
GridSheetManagerHelpers,GridSheetRowHelper,GridSheetColumnListHelperandGridSheetRowExtensionextensions.rowDataToMapis nowGridSheetRow.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 whenGridSheet.rowswas 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.evaluatorandGridSheetCellContext.evaluatorto the newGridSheetEvaluatorinterface (evaluate(String expression, Map context)), so theexpressionspackage's types are no longer part of the API.GridSheetExpressionEvaluatorimplements it instead of extendingExpressionEvaluator;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
CellValueChangedtypedef,GridSheetCellWidgetTypeenum andGridSheetSortKeyclass. - Stopped exporting internal classes: the formula engine,
GridSheetAutoFillEngine,GridSheetFillDirection,GridSheetColumnGroups,GridSheetSorter,GridSheetCellSelectionState,GridSheetRowExpansionForm,RowExpansionLayout,GridSheetEvaluatedFormatCache,GridSheetNoScrollbarBehavior,NegativeKeyGeneratorand 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/rowStateandexportToCSV(onlyCurrentpageRows:). - Changed manager calls to do nothing when their
GridSheetConfigurationflag is off, like the UI (e.g.rows.setHeightsneedsenableRowResize). - Changed
rows.resetOrder()andcolumns.setWidths()to returnFuture<void>. - Changed cell text to not wrap by default (
GridSheetColumn.wrapdefaults tofalse). - Changed
GridSheetCellValueChangedEvent.newValueto the stored, typed value instead of its string form. - Changed
GridSheetFormConfiguration.formBuilderto replace only the card's content. - Changed
columns.insert/columns.duplicateto always insert into the scrollable section. - Changed a conditional format rule with a
textStylebut noexpressionto apply to every cell it covers. - Changed
GridSheetRow.indexon server-side pages and infinite-scroll batches to the row's position in the grid. - Changed the default
GridSheetStyleConfiguration.rowDragFeedbackElevationfrom4.0to8.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
enableCellSelectionis on. - Changed editable table cells to mount a
TextFieldonly while being edited; other cells draw the same box and text.
New Features #
- Made
GridSheetManageraListenable: listeners added withaddListenerare called once after each frame that changes the grid (data, selection, sort, filters, page, layout or view), so it works withListenableBuilder. - 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.visibleandrows.hide/show/showAll/hidden. - Added row swipe (
GridSheet.rowSwipeConfiguration) with per-side reveal strips, hold-open actions, full-swipe callbacks and per-rowcanSwipe. - Added
GridSheetRowSwipeExclusionto keep a cell widget's own horizontal drag (e.g. aSlider) 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) andgridManager.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.rowSeparatorBuilderandGridSheetRowSeparator. - Added
GridSheet.rowDragPreviewBuilderandGridSheetFormConfiguration.cardDragPreviewBuilderto 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 dottedBoxBorderusable in anyBoxDecoration. - Added
GridSheetFormConfiguration.cardWrapper. - Added reordering within pinned column panes (
enableReorderOnPinnedLeftColumns/enableReorderOnPinnedRightColumns). - Added
GridSheetColumn.wrapandcolumns.setWrap. - Added focused-cell tracking:
cursor.row,cursor.columnandcursor.cell. - Added
rows.count,columns.count,rows.at/atIndexes,columns.at/atIndexes,rows.findAll,columns.findAllandcolumns.findByNames. - Added
columns.hidden,columns.showAll,columns.pinTo,columns.unpin,columns.resetWidthsandGridSheetColumn.resetWidth. - Added
GridSheetConfiguration.showBottomBarBorder. - Added full-width row expansion across pinned and scrollable columns.
- Added text-only conditional formatting: an
expressioncan returntrueto apply onlytextStyle. - Added date comparisons and a
_todayvariable to expressions. - Added
GridSheetSnapshot.formulas, so restoring a snapshot rebuilds its formulas. - Added debug warnings when
GridSheet.rows/columnschange after mount, and when a cell-scoped rule'snamematches no column. - Improved client-side sorting about 10× on large grids.
- Improved filter, search, select-all, formula refresh, column auto-fit and
formatting.stylesperformance 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
infiniteScrollto process only newly fetched rows. - Improved cell build cost.
- Improved scrolling with editable columns about 4× by not mounting a
TextFieldin every cell. - Improved memory use on large grids: rows create
rebuildNotifieron first use. - Improved refreshes to reuse
rowSeparatorBuilderheights until rows change ornotifyListenersis called. - Improved scrolling: one shared scroll position per axis, and each row built once instead of once per pane.
- Added
GridSheetScrollbarand theexternalscrollbar 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
GridSheetRowobjects are shown in aGridSheetagain 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.originalDataholding 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.modifiedandchanges.deleted; it's now only inchanges.deleted. - Fixed
changes.undoAll()dropping rows deleted for good fromchanges.deletedwithout bringing them back, so an app saving fromchangesnever deleted them. Such rows now stay inchanges.deleted(a deletion can only be undone while its undo window is open), as withchanges.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.setRowsPerPagenow throws anArgumentErrorfor such a size and leaves the pagination unchanged, and aGridSheetConfigurationwith pagination on (the default) assertsrowsPerPageis at least 1. - Fixed a column renamed through
GridSheet.columns(same key, newname) losing its filter, and keeping a sort that was reported but no longer applied; it now keeps both, as withcolumns.rename. - Fixed swapping two columns' names in one
columns.renamecall 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.modifiedonly 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.undoon 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.rowslist 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,containsColumnandcontainsCellconstant-time instead of copying and scanning the selection on every call. - Fixed a failing first-page fetch on mount (
onPageChangewith no initial rows) being an unhandled error; it's now reported toonError(GridSheetErrorSource.pageChange). - Fixed an exception in
cellBuilderbreaking the grid's build; it's now reported toonError(GridSheetErrorSource.cellBuilder) and the default cell is shown. - Fixed the hovered row staying hovered after
enableRowHoveris turned off at runtime. - Fixed
rows.insertwith no selection under client-side pagination inserting at the wrong position. - Fixed
columns.insertwith no selection andcolumnInsertPosition: beforedoing nothing. - Fixed
infiniteScrollnot showing the loading indicator while a page is fetched. - Fixed
GridSheetRow.isSelectedgetting out of sync with the grid's selection. - Fixed a row created with
isSelected: trueshowing 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
pinnedLeftandpinnedRightwhen onlyconditionalFormatIncludesPinnedRightCellswas 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
findAndReplacestoring values as text in typed columns. - Fixed
GridSheetDataSource.rowsFromJsonandtoParsedDataMapturning lists, maps and objects intonull. - Fixed the (Blanks)/(Non-Blanks) filters treating empty lists and maps as non-blank.
- Fixed
selection.cellsDatakeeping 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.valuesanddataexports 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.restorebreaking formulas after rows were sorted, inserted or deleted. - Fixed
snapshots.restorekeeping 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.renameleaving an open context menu showing the old name. - Fixed
columns.resetOrderusing the latestGridSheet.columnsinstead of the original order. - Fixed the
GridSheetRowReorderEvent.toIndexdocs: it's the insertion index before the move, likeReorderableListView.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
infiniteScrolladding 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
infiniteScrollrefetching 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/hoveredRowKeyfor querying row-hover state from a customcellBuilder. - Added
GridSheetCellContext.columnSortState, exposing a header cell's current sort direction.
2.2.2 #
Bug Fixes #
- Fixed
stretchColumnsToFillWidthnever shrinking columns back down after growing. - Fixed
gridBorderRadiuscorners 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
CircularProgressIndicatorwith a numeric countdown. - Added
GridSheetStyleConfiguration.footerRowBorderColor. - Added a
drag_indicatoricon on row hover in the index cell when row reorder is enabled.
2.2.1 #
Breaking Changes #
- Changed
between/notBetweenfilters to use the..delimiter (e.g.'10..50') instead of the previous dash-based format. - Changed
addFilters's defaultcomparisonfromGridSheetFilterComparison.containsto.auto, so unparenthesized values containing>,<,!,%,.., or a leading=are now reinterpreted as typed-operator syntax unlesscomparisonis passed explicitly. - Renamed
GridSheetFilterComparison.notEqualtonotEquals.
Bug Fixes #
- Fixed pooled cell controllers and focus nodes being disposed while gestures were still active.
- Fixed
GridSheetControllerPoolleaking 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
onAfterReloadbeing called after a grid was disposed. - Fixed exceptions from host callbacks interrupting grid operations.
- Fixed expression caches being shared between
GridSheetinstances. - Fixed
GridSheet.noRowsWidgetlayout and positioning issues. - Fixed the
noRowsWidgetoverlay swallowing horizontal scrollbar drags by reserving its bottom gutter. - Fixed
contextMenuWidgetcrashing when invoked for the index column. - Fixed horizontal scroll windowing not updating when
GridSheet.indexColumnchanged.
New Features #
- Added
GridSheet.formConfigurationfor 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, andsearchExactMatchCase. - Added smart search syntax support for filter operators such as
>100,10..50,!apple, andapp%. - Added
&&and||support for combining multiple filter values. - Added
GridSheetManager.autoReloadFailureCountto track consecutive auto-reload failures. - Added
GridSheetPagination.showGoToPagefor direct page navigation. - Added
GridSheetFilterComparison.autofor automatic filter operator parsing. - Added
GridSheetDataHelpers.parseFilterSyntaxto 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
enableRowSelectionOnFirstColumnTapto fall back to the first visible data column whenGridSheet.indexColumnis hidden or pinned right. - Added precedence handling between
enableRowContextMenuandenableCellContextMenu.
2.2.0 #
Breaking Changes #
- Added
isSelectedtoGridSheetRowWrappercallbacks, to expose row-level selection state based onGridSheetManager.selectedRowKeysrather than individual cell selection. - Deprecated
GridSheetConfiguration.serialNumberColumnandserialNumberColumnWidth; useGridSheet.indexColumninstead. - Deprecated
GridSheetDynamicTableGeneration.typeandwidth; usecolumnBuilderandrowBuilderto 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.filtersexposing the mutable internal filter map by returning an unmodifiable view instead. - Fixed
getSelectedRows()andgetSelectedColumns()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(), andresetColumnOrder(). - Fixed
fillCells()triggering redundant formula recalculations against partially filled data by batching formula-dependent recalculations. - Fixed
createSnapshot()sharingdropdownOptionslists with live columns by copying the lists when creating snapshots. - Added
CellAuditTrailto the package's public exports alongside the existingCellChangeRecordexport.
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 deprecatedserialNumberColumnandserialNumberColumnWidthproperties with a singleGridSheetColumn?supporting title, width, pinning, alignment, and visibility configuration. - Added
GridSheetColumn.showOverflowTooltipfor opt-in per-column overflow hover tooltips, reducing unnecessary text-overflow measurement costs. - Added dynamic table customization through
GridSheetDynamicTableGeneration.columnBuilderandrowBuilder, 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, andGridSheetUndoDeleteEventcallbacks. - Extended
GridSheetCellContext.onToggleRowExpansionandisRowExpandedto 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, andpinnedColumnsDividerWidth, rendered between panes without overlaying active cell content.
2.1.0 #
Breaking Changes #
- Changed
GridSheetRow.datato an unmodifiable view to prevent mutations that bypass change tracking and formula dependency updates; useGridSheetManager.setCellAtorupdateRowByKeyinstead. - Changed
GridSheetRow.heightto 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
isPinnedRightparameter toGridSheetHeaderWrapper,GridSheetFilterWrapper, andGridSheetRowWrappercallbacks, requiring existing callbacks to accept the new parameter. - Changed
enableCellNavigationLeft/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()andupdateRowHeightsByKeys()updating model heights without visually resizing the corresponding rows. - Fixed
autofillVerticalCells()andautofillHorizontalCells()ignoring suppliedsourceValuesby seeding source cells with the provided values before extrapolation. - Fixed stale column widths returned by
findColumnByKey(),findColumnByName(), andgetColumnWidths()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
enableCellSelectionis 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 causingsetState()/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, andGridSheetErrorSourcefor routing internally handled failures to custom error-reporting systems instead ofdebugPrint. - 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
enableCellNavigationwith dedicatedShortcuts/Actionsbindings so Tab/Shift+Tab follow logical order across pinned/hidden columns, Shift+Enter moves upward, and read-only cells remain keyboard-selectable. - Added
GridSheet.noColumnsWidgetto 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
hoverColorOnRowto matchselectionColorbehavior whenshowBorderOnSelectionis 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 (
afterLastColumnoroverlay). - Added configurable resize handle color and thickness.
- Added configurable drag feedback elevation and opacity.
- Added independent cell editor border color and width.
- Added
stretchColumnsToFillWidthto expand columns and fill available width. - Added
maxStretchWidthto 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(), andupdateRowHeights()using incorrect row positions with client-side pagination. - Fixed
betweenandnotBetweenfilters failing with negative values. - Fixed corrupted pagination state causing duplicate rows after a failed
infiniteScrollreload. - Fixed incorrect serialization of conditional-format
fontWeightvalues ingetConditionalFormattingStyles(). - Fixed
animationConfiguration,conditionalFormatRules, andevaluatornot updating afterGridSheetrebuilds. - Fixed the context menu remaining open after row/column changes, sorting, filtering, or reloads.
- Fixed
GridSheetRow.copyWith()losing the original row height, breakingresetHeight(). - Fixed
findAndReplacecounting matches in read-only and non-editable cells. - Fixed
parseHexColorincorrectly parsing 3-digit shorthand hex colors. - Corrected
GridSheetRowdocumentation to prevent corrupting the undo baseline.
2.0.2 #
- Added a live demo page to showcase GridSheet features and capabilities.
- Added
GridSheetConditionalFormatRule.stopIfTrueto 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.reorderConditionalFormatRulesByPositionsto allow changing conditional formatting rule priority after rules have been added. - Added the
atIndexparameter toaddConditionalFormatRuleto insert a new conditional formatting rule at a specific priority position instead of adding it at the end. - Renamed the
GridSheetCellValueChangedEvent.columnNameproperty tonamefor improved clarity and consistency. - Added the
titleproperty toGridSheetCellValueChangedEventto provide additional cell context. - Added support for preserving conditional formatting styles when generating exports
GridSheetManager.getConditionalFormattingStyles. - Fixed duplicate column border rendering in tables when
showColumnBordersis 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
nullto mixed-type data. - Fixed
LEFT,RIGHT, andMIDthrowingRangeError. - 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
infiniteScrollwithoutserverSidePagination.
2.0.0 #
Breaking Changes #
deleteRowsAt/deleteRowsByKeysnow returnFuture<List<ValueKey<String>>>instead ofFuture<int>.- Renamed
GridSheetLayoutConfigurationtoGridSheetConfiguration(deprecated alias provided). - Renamed
GridSheetgridManagerHelperstoGridSheetManagerHelpers. - Deprecated
GridSheetConfiguration.rowHeight; useGridSheetRow.heightfor 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
animateRowsOnSortOrFilterto animate row slide-in after sorting and filtering. - Row slide-in animation now supports server-side pagination and infinite scroll when enabled.
- Added configurable
cellChangeFlashEnabledanimation for edited or recalculated cells. - Added
columnVisibilityFadeEnabledfor smooth column show/hide width and opacity transitions. - Added
insertRowsandinsertColumnsAPIs with configurable insertion positions. - Added
defaultValuessupport forinsertRowsandinsertRowsAt. - Added
refreshAllFormulas; CSV exports now refresh formulas automatically before exporting. - Added
selectionIncludesPinnedLeftCellsandconditionalFormatIncludesPinnedLeftCells. - Added
showOnlyEditableColumnsto row expansion configuration. - Added
pinColumnsToLeft,clearPinColumns,pinnedLeftColumns, andactiveColumns. rowStateColorBuilder,rowStateIconBuilder, andsortIconBuildercan now returnnull.- Added
GridSheetRow.resetHeightto restore a row's original height. - Added
GridSheetManager.getCellFormulato retrieve a cell's raw formula. - Added
onlyCurrentPageRowstoexportToCSV.
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.
GridSheetConfigurationnow 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.
selectColumnAcrossAllPagesnow correctly affects selected-column APIs.resetAllRowHeightsnow restores each row's original height.
API Changes #
- Added APIs for programmatic pinned-column management.
- Renamed
freezeColumnsUptoIndextopinColumnsLeftUptoIndex(deprecated alias retained). - Deprecated
freezeColumnsUptoKeyin favor ofpinColumnsLeftUptoIndex. - Renamed
GridSheetColumn.pinnedLefttopinnedLeft(deprecated alias retained). - Renamed
GridSheetColumnContextInfo.isFrozentoisPinnedLeft(deprecated alias retained). - Renamed
GridSheet.onCellValueChangetoonCellValueChanged(deprecated alias retained). - Fixed
exportToCSV.onlyCurrentpageRowstypo (onlyCurrentPageRowsis now canonical). - Deprecated
GridSheetConfiguration.rowHeightin favor ofGridSheetRow.height. - Renamed
GridSheetgridManagerHelperstoGridSheetManagerHelpers. - Renamed
Token/TokenTypetoGridSheetFormulaToken/GridSheetFormulaTokenType(deprecated aliases retained). - Restored deprecated compatibility shims for
enableReorderandreorderColumnsByOrder.
Default Changes #
- Changed default
rowsPerPagefrom 50 to 30. - Changed default grid border radius from 4px rounded to square.
1.3.1 #
- Added
row expansionfeature support — to expand an inline sub-panel (a child table, a form, extra fields). - Added new property
descriptioninGridSheetColumn— useful for abbreviated column names descriptions. - Added manual and scheduled auto-reload with reload callbacks and runtime controls.
- Added
rowsLoaderfor refreshing client-side data without rebuilding. - Added
updateConfigurationfor 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, andtoString). - Fixed
evaluateFormulareturn type. - Fixed
fillCells(increment: true)correctly incrementing numeric values.
1.3.0 #
- Added
server-side (lazy pagination),infinity-scrollpaginations feature support - Added row-reordering feature support
- Added cell type
GridSheetColumnType.dropdown— built-in dropdown/select cells feature support - Renamed
enableReorderproperty toenableColumnReorder - Renamed
reorderColumnsByOrdermethod toreorderColumnsByPositions - 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 Countaggregation - Added support of
showColumnHeaderRowoption inlayoutConfiguration - Added support of
ascSortIconColor,descSortIconColoroptions instyleConfiguration
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— usetextStyleinstead
1.2.3 #
- Refactor: replace static color/style fields with expression-based conditional formatting API
BREAKING CHANGE: removed
expression,backgroundColor,fontStyle— usebackgroundColorExpressionandtextStyleExpressioninstead
1.2.2 #
- Added dynamic table generation: tables can now be generated at runtime based on
columnsCountandrowsCount. - Added
renameColumnsmethod: allows renaming of column names and optional titles.
1.2.1 #
- Refactored internal auto-fill logic to reduce code duplication and improve maintainability.
- Added
loadingOverlayColoroption 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.