flutter_floating_bottom_bar 3.0.0
flutter_floating_bottom_bar: ^3.0.0 copied to clipboard
An adaptable Flutter floating bottom bar for navigation, search, and custom widgets, with scroll-aware visibility and accessible interactions.
Unreleased #
3.0.0 #
Breaking #
- Requires Dart
>=3.12.0and Flutter>=3.44.0. - Material imports now come from
package:material_ui/material_ui.dart. Apps still using the in-SDK Material must migrate their Material imports and theme tomaterial_ui; migrated apps no longer needMaterialUiCompatibilityBridgefor this package. BottomBarLayoutandBottomBarLayout.adaptivenow defaultborderRadiusto 28. PassBorderRadius.zerofor a square bar.
Added #
BottomBarLayout.avoidKeyboard(defaulttrue): pads the bar and hidden action byMediaQuery.viewInsets.bottomso they sit above the on-screen keyboard when the host hasn't already consumed it (e.g.Scaffold(resizeToAvoidBottomInset: false)). No-op when insets are already zero, and does not affectBottomBarScope.barHeightorBottomBarBodyPadding.BottomBarController.reportScroll({required double delta}): drives the bar's threshold/reverse/hideOnScrollvisibility rules from a scroll source that never emitsScrollNotifications, such as an embedded WebView. Visibility-only — it does not affectscrollToStart()/scrollToEnd(), which still require a realScrollPosition.BottomBarLabelBehavior(alwaysShow,onlySelected,alwaysHide) andBottomBarItems.labelBehavior: controls when descendantBottomBarItemlabels render. Exposed toBottomBarItemvia the new publicBottomBarItemsScopeinherited widget; items outside aBottomBarItemsrow keep thealwaysShowdefault.BottomBarScrollBehavior.keepVisibleOnFocus(defaulttrue): skips scroll-driven hide while the floatingBottomBar.childholds focus, so a search field or composer in the bar isn't hidden mid-scroll while the user is typing.BottomBarController.hide()still hides the bar regardless of focus; the bar is not auto-shown on focus.
Changed #
-
In bounded rows wide enough for each item's 48x48 minimum target,
BottomBarItemswraps every child inExpanded, so items share the row's width equally. Narrow bounded rows use a horizontal scroll view to preserve the minimum targets; unbounded rows keep their raw children. ABottomBarItem'sTextlabel (with non-nulldata) is truncated to a single line with an ellipsis;Text.richand other label widgets are unaffected. -
Migrated from
package:flutter/material.dartto the standalonematerial_uipackage. Material was decoupled from the Flutter SDK in 3.47; the in-SDK copy is frozen to contributions and scheduled for removal. Apps that have already migrated no longer needMaterialUiCompatibilityBridgeon account of this package — without it, the bar resolvedTheme.of(context).colorSchemeagainst the framework Material and silently fell back to a default theme. -
Minimum SDK constraints raised to Dart 3.12 / Flutter 3.44, which is what
material_uirequires. -
Attaching a
BottomBarControllerto a second bar now throws aFlutterErrorin debug builds as well, instead of anAssertionError. -
BottomBarLayoutandBottomBarLayout.adaptivenow defaultborderRadiusto 28 so passinglayout:no longer squares the bar. PassBorderRadius.zeroto opt out.
Fixed #
- Hidden bar descendants are excluded from keyboard focus, so a
TextFieldin the floating child cannot be tab-focused while the bar is hidden.
2.1.0 #
Added #
BottomBarLayout.maxWidthandBottomBarLayout.adaptive(maxWidth: ...)for width-capped adaptive layouts, pluscopyWith(clearMaxWidth: true)for returning a derived layout to an uncapped width.BottomBarBodyPaddingas the built-in way to reserve the live floating-bar footprint insideBottomBar.body.BottomBarScrollBehavior.showAtStartandBottomBarScrollBehavior.showOnScrollEndfor settling-based visibility restoration.
Changed #
BottomBarScope.barHeightnow reflects the full rendered footprint reserved by the bar, including configured offset and bottom safe-area when enabled.BottomBarItemaccessible naming is now deterministic:semanticLabelwins, otherwisetooltip, otherwise descendant semantics. Explicit names exclude descendant semantics to avoid duplicate announcements; items also expose selected/enabled button state, keep a 48x48 minimum target, and place badges at the directional top-end in both LTR and RTL layouts.- Custom
BottomBarMotion.transitionBuilderusage is documented as a paint-only contract that must preserve layout footprint. - The hidden action is direction-aware by default: glyph, tooltip, and
semantics flip with
scrollOpposite, the touch target stays at least 48x48 when active, and the default glyph color followsColorScheme.onPrimary. - Hidden bar actions are non-interactive and excluded from semantics when the bar is visible.
- Reduced-motion environments snap directly to the target shown/hidden state instead of animating.
BottomBarControllerownership is strict: double-attach fails in debug and release, and visibility updates are accepted only from the owning bar.BottomBarControllerboundary scrolling now documents and uses explicit start/end semantics independent ofscrollOpposite.
Fixed #
BottomBarController.scrollToStart()always targetsScrollPosition.minScrollExtent, andscrollToEnd()always targetsScrollPosition.maxScrollExtent.NestedScrollViewboundary scrolling now targets the correct coordinated controller so start/end actions reset both header and body as expected.- Large
iconOffsetvalues keep the hidden action tappable because hit testing now follows the translated visual position. - The hidden action's full 48x48 minimum target now accepts taps at its corners; circular clipping applies only to the animated visual.
- The example web app now uses Flutter's current generated bootstrap and package-specific, orientation-neutral PWA metadata.
2.0.2 #
- Fix:
BottomBarController.scrollToStart()(and the back-to-top icon) did not fully reset aNestedScrollView— the collapsedSliverAppBar/FlexibleSpaceBarstayed collapsed and the list landed below its true top. ANestedScrollViewscrolls on two coordinated positions (an outer header and an inner body), but the bar only animated the most-recently-active one. The controller now detects an enclosingNestedScrollViewand drives its shared scroll coordinator with a single call — animating the outer controller to the top (which pulls the inner body up with it) forscrollToStart, and the inner controller to the bottom (which collapses the header) forscrollToEnd. (#21)
2.0.1 #
- Fix: the back-to-top icon became unclickable when a large
iconOffsetwas set. The icon was painted at the offset position but itsSafeAreaancestor still hit-tested against the original (untranslated) rect, so a large offset moved the visible icon outside its tappable area. The offset now wraps the icon'sSafeAreaso hit-testing follows the painted position. (#19)
2.0.0 #
Major release. Breaking changes — see the migration table in README.md.
Breaking:
- Dart SDK minimum is now
>=3.5.0because the package uses Motor-backed motion. BottomBar.bodyis nowWidgetinstead ofWidget Function(BuildContext, ScrollController). The bar listens toScrollNotificationfrom any descendant scrollable; you no longer wire a controller through the builder.- The
barColor,width,offset,borderRadius,barAlignment,fit,clip, andrespectSafeAreaparameters moved intoBottomBarLayout. - The
duration,curve,start, andendparameters moved intoBottomBarMotion.BottomBarMotion()now defaults to Cupertino spring motion; existingBottomBarMotion(duration: ..., curve: ...)calls remain curve-based.start/end(doubles) are nowslideStart/slideEnd(Offsets). - The
hideOnScroll,reverse,scrollOpposite, andscrollDeltaThresholdparameters moved intoBottomBarScrollBehavior.scrollDeltaThresholdis nowdeltaThreshold. - The
iconWidth,iconHeight,iconDecoration, andbarDecorationparameters moved toBottomBarThemeData(per-instance overrides remain via thetheme:argument). BottomBarScrollControllerProvideris replaced byBottomBarScope. ThescrollControllerfield is gone; new fields arebarHeightandisVisible.- The hardcoded
Colors.blackdefault is replaced with Material 3colorScheme.surfaceContainerfor the bar andcolorScheme.primaryfor the icon.
New:
- Motor-backed Cupertino motion is the default show/hide engine, with velocity-preserving redirection when scroll direction changes mid-animation.
BottomBarMotion.cupertino(...),BottomBarMotion.curved(...), andBottomBarMotion.motor(...)constructors.BottomBarThemeDataThemeExtensionfor app-wide defaults.BottomBarTransitionenum (slide,fade,scale,slideAndFade) plusBottomBarMotion.transitionBuilder.BottomBarItemandBottomBarItemshelpers for the common nav-item case.BottomBarScope.barHeightexposes the live rendered bar height to descendants for content-padding purposes.BottomBarScope.isVisibleexposes live visibility without owning a controller.- Notification-based scroll detection works with
NestedScrollView,CustomScrollView, multipleTabBarViewchildren, and any user-suppliedScrollControllerwith no wiring. BottomBarScrollBehavior.predicatefor filtering unwanted notifications.BottomBarControllernow asserts on double-attach in debug.
Repository:
- Package source moved from
packages/flutter_floating_bottom_bar/to repo root. The example app moved toexample/. Thepackages/directory is removed.
1.4.0 #
- Upgrade project/tooling for Flutter
3.41.4development via FVM. - Update SDK constraints and refresh dependencies.
- Add
BottomBarControllerfor programmaticshow,hide,toggle,scrollToStart, andscrollToEnd. - Add
onVisibilityChangedcallback for visibility state transitions. - Add
scrollDeltaThresholdto reduce flicker from minor scroll movement. - Add
iconSemanticLabelandiconTooltipfor better accessibility. - Improve internal scroll/visibility handling and test coverage.
1.3.0 #
- Added
respectSafeAreaproperty to control whether theBottomBarshould respect the safe area. - Removed deprecated
alignmentproperty (usebarAlignmentinstead). - Fixed
ScrollControllerissues with multiple attachments. - Improved scroll listener management for better performance.
1.2.1+1 #
- Fix code formatting.
1.2.1 #
- Update to Flutter
3.22.1. - Fix divider error in example.
- Update dependencies.
1.2.0 #
- Add
offset,barAlignment,barDecoration, andiconDecorationproperties. - Remove
bottomproperty. - Deprecate
alignmentin favor ofbarAlignment. - Update all code examples and fix errors.
1.1.0 #
- Add
clipproperty to support clip behavior. - Add an example for a bar with a FAB.
1.0.1 #
- Support Flutter
3.10.5. - Update dependencies.
1.0.0+1 #
- Add documentation.
1.0.0 #
- Initial release with basic functionality.