flutter_show_menu 1.0.1
flutter_show_menu: ^1.0.1 copied to clipboard
OverlayEntry-based showMenu replacement. Position menus top, bottom, left, or right of any widget with start, center, end alignment.
1.0.1 #
Fixed #
- fix: The declared Flutter floor was dishonest.
pubspec.yamlallowedflutter: ">=3.10.0", but the code usesWidgetStatePropertyAll(inScrollbartheming), which is the Flutter 3.22 rename ofMaterialStatePropertyAlland does not exist before 3.22. A user on 3.10–3.21 could resolve this package and then hit a compile error. The floor is now>=3.22.0, the real minimum the code requires.
1.0.0 #
Breaking #
- BREAKING:
showOverlayMenuandOverlayMenuButtontake grouped configuration objects instead of 18 loose parameters. See the migration table below. - BREAKING:
width,constraints, anddecorationmoved ontoOverlayMenuStyle, rejoiningmaxHeight. - BREAKING:
OverlayMenuButtonno longer hasmenuWidthandmenuConstraints. Usestyle: OverlayMenuStyle(width: ..., constraints: ...). - BREAKING:
OverlayMenuController.close()now plays the exit animation, as selecting an item and tapping the barrier already did.isClosedstill becomes true immediately; the widget leaves after the animation. Route changes andcloseAllOverlayMenus()remain instant.
| Was | Now |
|---|---|
position:, alignment:, offset: |
placement: OverlayMenuPlacement(...) |
barrierDismissible:, barrierColor:, overlayChild: |
barrier: OverlayMenuBarrier(dismissible: ..., color: ..., overlayChild: ...) |
animationDuration:, animationCurve: |
motion: OverlayMenuMotion(duration: ..., curve: ...) |
width:, constraints:, decoration: |
style: OverlayMenuStyle(width: ..., constraints: ..., decoration: ...) |
All groups are const-constructible with defaults, so showOverlayMenu(context: c, items: [...]) is unchanged.
Fixed #
- fix: An item whose
onTappushed a route returnednullinstead of its value. The push triggered a route auto-close that completed the future before the exit animation ended. The result is now fixed when the close is requested, so a navigating item still returns its selection. - fix:
closeAllOverlayMenus()called during a menu's exit animation overwrote the selected value withnull. It now tears the menu down immediately, as documented, while still delivering the value the user chose. - fix: Reusing one
OverlayMenuControlleracross two menus silently rebound it. Rebinding is now explicit and closes only the menu it is bound to. - fix:
initialValuecentred its item againstmaxHeightrather than against the scroll viewport, which is smaller — the menu's padding and any header or footer sit outside it. The entry was pushed down by half the difference: 4px with default padding, 52px with a 48px header and footer. It now centres against the real viewport. - fix: A menu flipped to the opposite side of its target — because it would have overrun the screen — still scaled open from the corner it would have used unflipped. It appeared to grow into the widget it was anchored to rather than out of it, by 10% of its height: 5.6px for a small menu, 30px for a 300px one. The scale origin now follows the side the menu actually landed on. See
docs/adr/0004-resolve-the-scale-origin-during-layout.md.
Changed #
- change: Passing a
contextthat is unmounted, or whose render object is not aRenderBox, now fails with aFlutterErrornamingshowOverlayMenuand what to pass instead. It previously threwtype 'Null' is not a subtype of type 'RenderBox', or — in release builds, where Flutter's own check is an assert — silently opened the menu at the position of a widget that was gone.
Added #
- feat:
OverlayMenuButtongainsinitialValueandcontroller, whichshowOverlayMenuhad but the button had silently dropped. - feat:
OverlayMenuPlacement,OverlayMenuBarrier, andOverlayMenuMotion. - feat: Value semantics —
==,hashCode, andcopyWith— on all four configuration objects and onOverlayMenuItemStyle,OverlayMenuDividerStyle, andOverlayMenuScrollbarStyle. Equality composes, so two styles differing only in a nested field compare unequal.OverlayMenuMotion.curveandOverlayMenuBarrier.overlayChildcompare by identity, as their own types do.
Internal #
- An open menu's lifetime is now a single module. "Closed" had four representations; it has one. Every close path — selection, barrier, controller, route change, close-all — goes through it, which is what
docs/adr/0001-global-close-all-registry.mdrequired and only a comment enforced. - Entry height and the initial-value scroll offset resolve in one pure module, so the arithmetic that predicts an item's position and the widget that lays it out can no longer disagree.
- The exit animator no longer catches
TickerCanceled. It was unreachable:TickerFuturedelivers that error toorCancel, never to the future the animation returns. - Tests: 9 → 148, and
lib/is at 100% line coverage. CI runs formatting, analysis, the suite, and a coverage floor on every pull request. - See
docs/adr/0002-latch-the-result-when-close-is-requested.mdanddocs/adr/0003-group-menu-configuration-by-cohesion.md.
0.7.0 #
- feat:
closeAllOverlayMenus()— closes every open overlay menu app-wide at once, immediately and with a null result, without needing anOverlayMenuControllerreference. For non-route moments (session expiry, app backgrounding, event-driven cleanup); route changes already auto-close menus
0.6.1 #
- feat:
backgroundColorandselectedBackgroundColoronOverlayMenuItemStyle— painted on the ink layer so InkWell hover/splash renders on top - fix: Wrap each item in
Material+Inkso hover/splash work correctly with item background colors - fix: Scrollbar now hugs the right edge of the menu regardless of
padding
0.6.0 #
- BREAKING: Remove
paddingandtextStylefromOverlayMenuItemStyle— handle padding and text styling directly in the item'schildwidget - BREAKING: Remove
paddingfromOverlayMenuItem— usePaddingwidget insidechildinstead
0.5.0 #
- BREAKING: Remove
selectedfromOverlayMenuItem— useinitialValueonshowOverlayMenuinstead - BREAKING: Remove
OverlayMenuSelectedStyleandselectedStylefromOverlayMenuStyle - BREAKING: Remove
prefixBuilderfromOverlayMenuItemandOverlayMenuStyle - BREAKING: Remove
prefixSpacingfromOverlayMenuStyle - feat:
initialValueparameter forshowOverlayMenu— auto-scrolls to the matching item when the menu opens
0.4.1 #
- feat:
heightparameter forOverlayMenuDividerandOverlayMenuDividerStyle— control total divider height independently from line thickness - feat:
prefixSpacingparameter forOverlayMenuStyle— configurable gap between prefix widget and item child (default12.0)
0.4.0 #
- BREAKING: Move
paddingfromshowOverlayMenutop-level parameter intoOverlayMenuStyle.padding - BREAKING: Remove
menuPaddingfromOverlayMenuButton(usestyle: OverlayMenuStyle(padding: ...)instead) - feat:
overlayChildparameter — full-screen overlay above the barrier (e.g. drag-to-move area)
0.3.1 #
- feat: Hide header/footer dividers when the items list is empty
- docs: Translate all comments and doc comments to English
- docs: Add library-level doc comment for pub.dev API docs
- docs: Add doc comments to
MenuPositionandMenuAlignmentenum values - docs: Add parameter descriptions to
showOverlayMenu - fix: Resolve broken dartdoc references (
OverlayMenuStyle.itemHeight,dividerColor,dividerThickness)
0.3.0 #
- feat: Auto-close menu on route pop or new route push — no more orphaned overlays on navigation
- feat:
OverlayMenuController— programmatically close a menu with safe idempotentclose()/isClosedcheck - feat:
controllerparameter forshowOverlayMenu
0.2.0 #
- feat:
header/footerfixed entries forshowOverlayMenuandOverlayMenuButton— pinned above/below the scrollable items area - feat:
OverlayMenuHeaderStyle/OverlayMenuFooterStyle— independent styling for header/footer items (same options asOverlayMenuItemStyle) - feat:
OverlayMenuDividerStylenow supportsindent/endIndent
0.1.1 #
- feat: Auto-scroll to selected item when menu opens (applies when
maxHeightis set)
0.1.0 #
- feat:
showOverlayMenu— imperative function API replacing Flutter'sshowMenu - feat:
OverlayMenuButton— declarative widget wrapper for tap-to-show menus - feat:
OverlayMenuEntrysealed class — base type for menu entries (OverlayMenuItem,OverlayMenuDivider) - feat:
OverlayMenuItem— menu item with value, child, enabled, onTap, selected state, prefixBuilder - feat:
OverlayMenuDivider— horizontal divider entry with color, thickness, indent - feat:
OverlayMenuStyle— grouped style options for menu container, items, selection, dividers, scrollbarOverlayMenuItemStyle— height, borderRadius, hover/splash/highlight/focus colors, mouseCursorOverlayMenuSelectedStyle— backgroundColor, textStyle, border for selected itemsOverlayMenuDividerStyle— color, thicknessOverlayMenuScrollbarStyle— thumbColor, thickness, radius, thumbVisibility
- feat:
MenuPosition(top, bottom, left, right) — controls which side of the target the menu appears - feat:
MenuAlignment(start, center, end) — controls cross-axis alignment - feat:
maxHeightwith automatic scroll when content overflows - feat:
prefixBuilder— per-item or style-level prefix widget with selected state - feat: Fade + scale enter/exit animation with configurable duration and curve
- feat: Automatic screen-edge flip when menu overflows viewport
- feat: Barrier dismiss support with optional barrier color