flutter_folderview 0.11.2
flutter_folderview: ^0.11.2 copied to clipboard
A customizable Flutter widget for displaying hierarchical data in tree and folder views with rich theming support.
0.11.2 #
- deps:
just_tooltip^0.4.4(#71). Unlike0.11.1's bump, this one is not documentation of intent: raising the floor is what carries the fix to a project that already depends on us.pubdoes not re-resolve a lockfile that still satisfies its constraint, so^0.4.3left an installed0.4.3exactly where it was — measured, by pinning this repo's own lock to the floor:pub getmoved it to0.4.4under^0.4.4and not at all under^0.4.3. No new SDK bound; the Flutter3.13.0floor is still0.4.2's. - docs:
just_tooltip0.4.4narrowed its nesting-suppression rule — the innermost tooltip under the pointer that has something to draw now wins, where before having nothing to draw was enough to take an ancestor's place. Two places stated the old rule as a fact about the package:FolderView's internal row-card dartdoc, which ships to the API docs, and the characterisation-test header that pins the behaviour. Both now state the rule that 0.4.4 actually implements.- No behaviour changes here, and none is claimed.
flutter_folderviewnever builds an empty tooltip — a Node with no label tooltip content is not wrapped, and nor is a row whoserowTooltipBuilderreturnsnull— so the new qualifier can never bite, and the existing tests pass against0.4.4untouched. The README's account of the two tooltips describes those guarded tooltips rather than the package's rule, and remains correct as written.
- No behaviour changes here, and none is claimed.
0.11.1 #
- fix: a row card no longer dies when the cursor returns to the row from the card itself (via
just_tooltip 0.4.3). Leaving the card armed a 100 ms hover bridge that re-entering the row never cancelled: it fired unseen, faded the card out, and a pointer already inside the row sends no further enter event to revive it. The card vanished about 250 ms after the cursor came home — a quarter second removed from its cause, and easy to trigger, since an interactive card anchored at the pointer is drawn right beside it. Reproduced against0.4.2before the bump: the card was gone 450 ms after the round trip and never returned. - deps:
just_tooltip^0.4.3. Changes no API and no SDK bound —0.11.0's^0.4.2constraint already resolved it, so this documents intent. The Flutter3.13.0floor is0.4.2's and unchanged. - docs: the README now states the minimum Flutter version beside the install snippet. It never did, while
0.11.0raised it from3.10.0.
0.11.0 #
- feat:
FolderView.rowTooltipBuilder(#44) — a card shown while the pointer is anywhere over a Node's rendered row. Returnnullfor a Node that should not have one. It is declared once on theFolderView, not per Tier, because it explains the Node, where the existingNodeTooltipThemetooltip attaches to the icon-and-label content and explains the label. Both can be enabled at once.- The card is anchored at the pointer, and this is not configurable. A row is laid out at the tree's content width, not the viewport's, so anchoring to the row's rect would aim at a centre that leaves the screen as soon as the view scrolls horizontally.
- feat:
FolderView.rowTooltipTheme— aRowTooltipThemecovering the card's presentation and behaviour:interactive,waitDuration,showDuration,enableHover,direction,alignment,offset,crossAxisOffset,screenMargin, the animation fields,onShow/onHide, andsurface. Without it the card was frozen atjust_tooltip's defaults — shown the instant a pointer crossed a row, with no way to delay it or to stop it holding the cursor.surfacedefaults toJustTooltipTheme.bare(), so the tooltip draws no chrome around a card that draws its own. Give it a realJustTooltipThemewhen the builder returns unadorned content.interactivedefaults totrue. The card is anchored at the pointer, so it is drawn beside the cursor and a small movement enters it; and its contents are the kind a user may want to reach. The label tooltip's default is the opposite, and deliberately so — it explains text you read, then leave.- The anchor is the one knob the theme does not expose. See above.
- The two divide the row. Only one tooltip is ever visible — the innermost under the pointer — and a label tooltip claims exactly the glyphs it explains. The row card takes everything else: the indent, the icon, the expand chevron, the space beside a short label. Enable both.
- The label tooltip now wraps the label's
Textrather than the icon-and-labelRow. It previously covered the icon, and — becauseFlexiblegrows a label to fill its row, and a row is as wide as the tree's longest label — on the widest row it covered the entire row, leaving that Node's card unreachable. Matchesflutter_table_plus, where a cell's text tooltip wraps the bareText: a text tooltip belongs to the glyphs. TooltipAnchor.childtherefore now centres a label tooltip on the glyphs rather than on the icon-plus-glyphs box, moving it right by half the icon's width.
- The label tooltip now wraps the label's
- feat:
NodeTooltipTheme.anchor(#42). A node's tooltip attaches to its icon-and-label content, and a long label fills its row — so a tooltip anchored to that rect appears at the row's centre, which can be far from where the user is actually pointing, and outside the view entirely once the tree scrolls horizontally.anchor: TooltipAnchor.pointerkeeps the same hover region but places the tooltip at the cursor.TooltipAnchoris now re-exported. Defaults toTooltipAnchor.child, the behaviour shipped in0.10.2, so existing tooltips are unchanged.- The anchor is captured when the tooltip is shown and does not follow the pointer, so
interactivetooltips stay reachable. Tap-triggered tooltips anchor at the tap; acontroller-driven show with no pointer present falls back to the label's rect. - Against a point there are no target edges to align to, so under
TooltipAnchor.pointerthealignmentfield selects which of the tooltip's own edges lands on the pointer. anchordoes not widen the hover region — a short label leaves the space to its right raising no tooltip under either anchor. For that, userowTooltipBuilderabove.
- The anchor is captured when the tooltip is shown and does not follow the pointer, so
- note:
TooltipRegistry(added injust_tooltip 0.3.0) is deliberately not re-exported.rowTooltipBuilderis the first place this package nests one tooltip inside another, and it needed no registry:just_tooltip 0.4.0suppresses an ancestor whenever a descendant holds the pointer, regardless of registry. Exposing it would grow the public surface for a use case — isolating aFolderView's tooltip group from the host app — that has not yet appeared. - deps:
just_tooltip^0.4.2, which raises the minimum Flutter to3.13.0(Dart3.1.0), up from3.10.0. Its ancestor clip walk readsRenderObject.parent, which wasAbstractNode?— a type with nodescribeApproximatePaintClip— until Flutter 3.13.flutter_folderviewdeclared>=3.10.0while its^0.4.0constraint already resolved0.4.2, so that floor had become a promise it could not keep. - fix: a label tooltip is no longer painted outside the
FolderView(#47). When a tree scrolls horizontally, a long label's rect extends past the view, andTooltipAnchor.childaimed at its centre — a point nobody could see.screenMarginnever objected: it confines the tooltip to the enclosingOverlay, usually the whole app.just_tooltip 0.4.2now targets the visible part of a clipped child, so the tooltip lands inside the view. Pre-existing; every version with tooltips had it.- Two further
just_tooltipfixes come along: a visible tooltip now re-aims when its child moves (scroll, resize, insertion above it) and hides once the child is clipped away entirely; and the target rect now follows the child's paint transform, so aTransform.scalebetween a node and theOverlayno longer mis-sizes it.
- Two further
0.10.2 #
- deps: Bump
just_tooltipto^0.4.0. Not breaking forflutter_folderview: nothing was removed fromjust_tooltip's API, the re-exportedJustTooltipControlleris unchanged, and its one behaviour change — a nested tooltip now suppresses its ancestors — cannot be reached from here, sinceFolderViewwraps exactly oneJustTooltipper node label and never nests them. Node tooltips gainjust_tooltip's fix for tooltips laid out in anOverlaythat does not fill the window from its origin: under a nestedNavigator, an insetOverlay, or an embedded Flutter view, a node's tooltip was displaced by the Overlay's offset and had its auto-flip andscreenMarginclamping measured against the wrong bounds. Placing aFolderViewinside such a host now positions its tooltips correctly. Noflutter_folderviewAPI changed. - note:
just_tooltip 0.4.0addsTooltipAnchor, which anchors a tooltip at the pointer instead of the child's rect. It is deliberately not re-exported yet:NodeTooltipThemehas noanchorfield, so the enum would be visible but unusable. Exposing it is aflutter_folderviewfeature decision, tracked in #42 along withTooltipRegistry, whichjust_tooltip 0.3.0added and which is likewise not re-exported.
0.10.1 #
- perf: Remove the per-row
Materialfrom node rows.CustomInkWellno longer wraps each row in its ownMaterial > Ink > InkWell; insteadFolderViewContentprovides a single transparentMaterialonce above the row list, and every row's ink (splash / highlight) paints onto that shared surface. Profiling a large tree under fling scroll showed the per-row Material crossed the 16 ms frame budget noticeably more often than the shared-Material variant. Ripple, hover, highlight, and selection are visually unchanged; the publicFolderViewAPI is unchanged (CustomInkWellis an internal row primitive and now requires an ancestorMaterialby design).
0.10.0 #
- BREAKING: Bump
just_tooltipto^0.3.0. ItsJustTooltipController— re-exported here and usable viaNodeTooltipTheme.controller— is no longer aChangeNotifier:shouldShowandaddListener/removeListener/disposeare removed. Drive it withshow()/hide()/toggle()and observe visibility via the tooltip'sonShow/onHidecallbacks.just_tooltipalso narrowed its exports (JustTooltipPositionDelegate,TooltipShapePainter,JustTooltipOverlayare now internal). Noflutter_folderviewAPI changed. - perf: Pack a
FlatNode's ancestor tree-line flags into anintbitmask instead of a per-nodeList<bool>, removing a heap allocation for every flattened node (the flags are read only for painted rows). Flatten is ~3× faster and the flat-list heap footprint roughly halves on large trees. Tree-line rendering is unchanged; tree depth is capped at 63. - perf: Apply incremental expand/collapse in place on the cached flat list instead of copying the whole list on every single-node toggle — ~1.7× faster toggles on large trees. Visible rows and scroll anchoring are unchanged.
- perf: In
RowMetrics.maxWidth, merge the effective text style once per tier instead of once per node, removing the per-nodeTextStyleallocation on every data / scale / theme change (~5.5× faster on the warm measurement path). The returned width is unchanged, so horizontal scroll extent and clipping are identical. - test / ci: Add widget tests for the
FolderViewinteraction, selection, view-mode, and modifier+wheel scale-gesture contracts; add anintegration_testharness driving the example app end-to-end (boot, expand, select, zoom, view-mode switch); add a GitHub Actions analyze + test workflow; addbenchmark/microbenchmarks and heap-footprint measurements for the flatten / projection / maxWidth hot paths.
0.9.0 #
- refactor: Decentralize content scaling — each theme class now exposes its own
scale()method, replacing the prior centralized_applyScaleimplementation. Existing usage (FolderView(scale: ...)) is unaffected. - feat: Add
FlutterFolderViewTheme.scale({required factor, required defaultFontSize})andFlutterFolderViewTheme.scaledForContext(BuildContext, double)for callers who want a scaled theme outsideFolderView(custom previews, integration tests, etc.). - docs: Add
CONTEXT.md(domain glossary) and ADRs0001(scrollbars excluded from scale),0002(caller owns interaction state),0003(selection tier-bound to child),0004(tooltips excluded from scale). - test: Add 31 unit tests covering the new scale API (identity short-circuit, positivity assertion, chrome exclusion for scrollbars/tooltips, null
fontSizeresolution againstdefaultFontSize).
0.8.1 #
- fix: Explicitly set
SystemMouseCursors.clickas the defaultmouseCursoron nodeInkWell— newer Flutter versions no longer auto-apply the click cursor on hover
0.8.0 #
- BREAKING: Rename
blockCtrlScroll→blockModifierScrollto accurately reflect platform-aware behavior (Ctrl on Windows/Linux, Cmd on macOS) - BREAKING:
blockModifierScrollis nowbool?(defaultnull) — automatically followsonScaleChangedwhen unset - feat: Add
onScaleChangedcallback andscaleStepparameter for built-in modifier+scroll zoom handling - feat: Export
isScaleModifierPressed()helper for library consumers implementing custom zoom logic - fix: Use platform-aware modifier key check to prevent Windows key from permanently triggering zoom mode
0.7.1 #
- feat: Add
blockCtrlScrollparameter toFolderView(default:true) — optionally disable Ctrl/Cmd + scroll blocking for users who don't need zoom-by-scroll
0.7.0 #
- feat: Add
scaleparameter toFolderViewfor content zoom (default:1.0) - feat: Scale all layout dimensions proportionally — row height, icon sizes, text size, spacing, line width, indentation, content padding, border radius
- feat: Scrollbar appearance (thickness, track width, colors) is NOT affected by scale
- feat: Preserve visible node on scale change with automatic scroll position adjustment
- feat: Ignore scroll events when Ctrl/Cmd is pressed to support zoom-by-scroll without unintended scrolling
- fix: Defer scroll position adjustment to post-frame callback to prevent
setState() called during builderror - fix: Scale content width clamp limit (
3x viewport * scale) to prevent text ellipsis at high scale values - example: Add scale slider to Layout controls and Ctrl/Cmd + mouse wheel zoom support
0.6.9 #
- fix: Pre-compute content width from all nodes (including collapsed) to prevent layout jumps on expand/collapse
- fix: Include
letterSpacingin text width calculation for accurate horizontal scroll sizing - feat: Add
calculateMaxContentWidthmethod toSizeServicefor upfront width calculation - example: Add long name test options (Folder/Parent/Child) to data generator for horizontal scroll testing
0.6.8 #
- feat: Bump just_tooltip to 0.2.5
- feat: Add
hideOnEmptyMessageoption toNodeTooltipTheme— suppress tooltip when message is empty (default:true) - feat: Support
TooltipAlignment.startTargetCenterandendTargetCenteralignments — arrow dynamically points to the center of the target widget
0.6.7 #
- fix: Bump just_tooltip to 0.2.3 — fix
borderColornot visible whenshowArrow: false
0.6.6 #
- fix: Tighten
just_tooltipconstraint to^0.2.2to fix pub.dev lower bounds compatibility check
0.6.5 #
- feat: Bump just_tooltip to 0.2.1
- feat: Add
animation(TooltipAnimation) option toNodeTooltipTheme— supportsnone,fade,scale,slide,fadeScale,fadeSlide,rotation - feat: Add
animationCurve,fadeBegin,scaleBegin,slideOffset,rotationBeginoptions toNodeTooltipTheme - feat: Export
TooltipAnimationfrom barrel file
0.6.4 #
- feat: Bump just_tooltip to 0.2.0
- feat: Add
showArrow,arrowBaseWidth,arrowLength,arrowPositionRatiooptions toNodeTooltipTheme - feat: Add
borderColor,borderWidthoptions toNodeTooltipTheme - feat: Add
screenMarginoption toNodeTooltipTheme - feat: Export
JustTooltipThemefrom barrel file
0.6.3 #
- fix: Bump just_tooltip to 0.1.5 (bugfix)
0.6.2 #
- feat: Add
interactive,waitDuration,showDuration,boxShadowoptions toNodeTooltipTheme(just_tooltip 0.1.4)
0.6.1 #
- fix: Tooltip hover area now limited to icon+label only, no longer triggers on empty row space
0.6.0 #
- BREAKING CHANGE: Migrate tooltip from Flutter
Tooltiptojust_tooltippackage - BREAKING CHANGE: Remove
TooltipPositionenum — replaced byTooltipDirection(top/bottom/left/right) - BREAKING CHANGE: Remove
margin,verticalOffset,waitDuration,boxShadowfromNodeTooltipTheme - BREAKING CHANGE: Remove
richMessage/richMessageResolver— replaced bytooltipBuilder/tooltipBuilderResolver(WidgetBuilder) - feat: Add
direction(4-directional),alignment(start/center/end),offset,crossAxisOffsetproperties toNodeTooltipTheme - feat: Add
elevation,borderRadius,paddingproperties toNodeTooltipTheme - feat: Add
controller(JustTooltipController) for programmatic tooltip show/hide - feat: Add
enableTap,enableHoverproperties for tooltip trigger control - feat: Add
animationDuration,onShow,onHideproperties toNodeTooltipTheme - feat: Tooltip now wraps both node icon and label instead of label only
- feat: Export
TooltipDirection,TooltipAlignment,JustTooltipControllerfrom barrel file
0.5.3 #
- fix: Recursively collect parent nodes from nested folders in tree mode
0.5.2 #
- perf: Replace
setStatewithValueNotifierfor horizontal scroll offset and hover state to prevent full widget tree rebuilds - perf: Eliminate recursive list spreading in
FlattenService.flatten()by reusing a single mutable list with add/removeLast pattern
0.5.1 #
- fix: Show full text on horizontal scroll instead of ellipsis-truncated text using
OverflowBox
0.5.0 #
- BREAKING CHANGE: Remove
isExpandedproperty fromNode<T>model - nodes are now immutable - BREAKING CHANGE: Add
expandedNodeIdsparameter toFolderView,FolderViewContent, andNodeWidgetfor external expansion state management - BREAKING CHANGE: Update
SizeServicemethods to acceptexpandedNodeIdsparameter - perf: Add incremental expand/collapse with
expandNode()andcollapseNode()methods inFlattenService - perf: Implement text width caching via
_textWidthCacheto reduce expensiveTextPainterlayout calls - perf: Add lazy content width measurement - calculate as nodes render instead of upfront O(N) traversal
- perf: Optimize scroll performance for 20k+ nodes with
Transform.translateanditemExtentonListView.builder - fix: Clamp scroll offset to valid range instead of skipping sync when out of range
- fix: Preserve scroll position on bulk expand/collapse (expandAll/collapseAll) using viewport anchor node
0.4.0 #
- feat: Add
labelResolvertoFolderNodeTheme,ParentNodeTheme,ChildNodeThemefor dynamic label resolution based onnode.data - fix: Update animation controller duration in
didUpdateWidgetwhen themeanimationDurationchanges at runtime
0.2.4 #
- feat: Add
labelResolverto all node themes for dynamic label display
0.2.3 #
- feat: Add
colorandexpandedColorproperties toExpandIconThemefor expand icon color theming
0.2.2 #
- refactor: Unified expand icon logic to ensure consistent node layout alignment
- refactor: Add
isChildparameter to_buildExpandIconfor proper child node spacing
0.2.1 #
- feat: Add
hoverColor,splashColor, andhighlightColorproperties to all node themes for interaction color theming - feat: Add comprehensive tooltip support with
NodeTooltipThemeclass for all node types - feat: Add
rowHeightproperty toFlutterFolderViewThemefor configurable row height - feat: Add
rowSpacingproperty toFlutterFolderViewThemefor vertical spacing between rows - refactor: Remove
iconToTextSpacingproperty from all node themes - now controlled via iconmargin.right
0.2.0 #
- BREAKING CHANGE: Migrate from unified
FolderViewTextThemeandFolderViewIconThemeto node-type specific themes (FolderNodeTheme,ParentNodeTheme,ChildNodeTheme,ExpandIconTheme) - feat: Add custom
Widget?support for each node type instead of hardcodedIconwidgets - feat: Add
openWidgetproperty for folder nodes (displayed when expanded) - feat: Add
paddingandmarginproperties for each widget type - feat: Add
clickIntervalproperty toChildNodeThemefor configurable double-click detection (default: 300ms) - feat: Add
animationDurationproperty toFlutterFolderViewThemefor configurable expand/collapse animation speed - feat: Add theme resolver functions (
widgetResolver,textStyleResolver,selectedTextStyleResolver,openWidgetResolver) for dynamic styling based on node data - feat: Add generic type support
<T>to all theme classes for type-safe access tonode.data
0.1.2 #
- fix: Fixed scroll position being reset when expanding/collapsing nodes by removing contentHeight from SyncedScrollControllers key
0.1.1 #
- fix: Fixed scroll position calculation when switching between view modes or expanding/collapsing nodes
0.1.0 #
- feat: Add dual view modes (Tree and Folder)
- feat: Add three node types (Folder, Parent, Child) for flexible hierarchy representation
- feat: Add multiple line styles (Connector, Scope, None) for visual tree structure
- feat: Add comprehensive theming system (icon, text, line, scrollbar, spacing, node style)
- feat: Add interactive features (selection, tap handlers, expand/collapse animations)
- feat: Add synchronized horizontal and vertical scrolling with custom scrollbars
- feat: Add depth-based indentation for nested nodes
- fix: Correct indent and line positioning for nested nodes based on depth level