GlassSearchableBottomBar class
A glass bottom navigation bar with a morphing search pill.
Visually identical to GlassBottomBar but adds a search pill that shares the same AdaptiveLiquidGlassLayer as the tab pill. This means the two pills correctly liquid-merge at their edges — the same organic blending that makes the tab-bar + extra-button coupling feel native to iOS 26.
When isSearchActive is false the widget looks exactly like
GlassBottomBar with a compact search icon pill at the right edge.
When isSearchActive is true:
- The tab pill collapses to GlassSearchBarConfig.collapsedTabWidth.
- The search pill expands to fill all remaining space.
- Both widths are calculated with LayoutBuilder — real pixel values — so Both widths animate with iOS-accurate SpringSimulation physics — no null/intrinsic hacks.
All parameters mirror GlassBottomBar exactly, with the additions of isSearchActive and searchConfig. Deprecated: Use GlassTabBar.searchable instead.
GlassSearchableBottomBar is a zero-logic shim that will be removed in v1.0.
Migrate by replacing GlassSearchableBottomBar( with GlassTabBar.searchable(.
All parameters are identical. Replace any GlassBottomBarTab( with GlassSegment(.
// BEFORE
GlassSearchableBottomBar(tabs: [...], searchConfig: ..., ...)
// AFTER
GlassTabBar.searchable(tabs: [...], searchConfig: ..., ...)
- Inheritance
-
- Object
- DiagnosticableTree
- Widget
- StatelessWidget
- GlassSearchableBottomBar
- Annotations
-
- @Deprecated('Use GlassTabBar.searchable() instead. ' 'GlassSearchableBottomBar will be removed in v1.0. ' 'Migration: replace GlassSearchableBottomBar( with GlassTabBar.searchable(.')
Constructors
-
GlassSearchableBottomBar({required List<
GlassBottomBarTab> tabs, required int selectedIndex, required ValueChanged<int> onTabSelected, required GlassSearchBarConfig searchConfig, Key? key, SearchableBottomBarController? controller, bool isSearchActive = false, GlassTabBarExtraButton? extraButton, double spacing = 8, double horizontalPadding = 20, double verticalPadding = 20, double barHeight = 64, double searchBarHeight = 50, double barBorderRadius = _kDefaultBorderRadius, EdgeInsetsGeometry tabPadding = const EdgeInsets.symmetric(horizontal: 4), double iconLabelSpacing = 4, bool enableBlend = true, double blendAmount = 10, LiquidGlassSettings? settings, bool showIndicator = true, Color? indicatorColor, LiquidGlassSettings? indicatorSettings, double indicatorPinchStrength = 0.4, Color? selectedIconColor, Color? unselectedIconColor, Color? selectedLabelColor, Color? unselectedLabelColor, TextStyle? selectedLabelStyle, TextStyle? unselectedLabelStyle, double iconSize = 24, double labelFontSize = 11, TextStyle? textStyle, Duration glowDuration = const Duration(milliseconds: 300), double glowBlurRadius = 32, double glowSpreadRadius = 8, double glowOpacity = 0.6, Color? interactionGlowColor, double interactionGlowRadius = 1.5, GlassQuality? quality, double magnification = 1.15, double innerBlur = 0.0, bool platformViewBackdrop = false, MaskingQuality maskingQuality = MaskingQuality.high, GlobalKey<State< ? backgroundKey, SpringDescription? springDescription, GlassTabPillAnchor tabPillAnchor = GlassTabPillAnchor.start, GlassInteractionBehavior interactionBehavior = GlassInteractionBehavior.full, double pressScale = 1.04, double? tabWidth, double? indicatorBorderRadius, EdgeInsetsGeometry indicatorExpansion = const EdgeInsets.symmetric(horizontal: 12, vertical: 8), VoidCallback? onBarTap, bool whitenAtBottom = true, double whitenBottomThreshold = 45.0, double whitenAtBottomTarget = 1.0, ScrollController? scrollController, bool adaptiveBrightness = false, ValueChanged<StatefulWidget> >Brightness> ? onBrightnessChanged, ValueListenable<Brightness> ? brightnessOverride}) -
Creates a glass bottom bar with a morphing search pill.
const
Properties
- adaptiveBrightness → bool
-
Whether the bar adapts its light/dark appearance to the content
scrolling underneath it, like the iOS 26 system bars.
final
-
backgroundKey
→ GlobalKey<
State< ?StatefulWidget> > -
Background key for Skia/web refraction. Optional.
final
- barBorderRadius → double
-
Corner radius of both pills. Defaults to 32 (full pill shape).
final
- barHeight → double
-
Height of the tab pill and search pill. Defaults to 64.
final
- blendAmount → double
-
Liquid-glass blend amount for the shared AdaptiveLiquidGlassLayer.
final
-
brightnessOverride
→ ValueListenable<
Brightness> ? -
External brightness source that bypasses the content sampler entirely.
final
- controller → SearchableBottomBarController?
-
Optional controller to manage the search bar state machine externally.
final
- enableBlend → bool
-
Whether to enable organic liquid blending between the tab pill,
search pill, and extra button.
final
- extraButton → GlassTabBarExtraButton?
-
Optional extra action button shown between the tab pill and the search pill.
final
- glowBlurRadius → double
-
Blur radius of the glow. Defaults to 32.
final
- glowDuration → Duration
-
Duration of the tab glow animation. Defaults to 300 ms.
final
- glowOpacity → double
-
Opacity of the glow at full intensity. Defaults to 0.6.
final
- glowSpreadRadius → double
-
Spread radius of the glow. Defaults to 8.
final
- hashCode → int
-
The hash code for this object.
no setterinherited
- horizontalPadding → double
-
Horizontal padding around the full bar content. Defaults to 20.
final
- iconLabelSpacing → double
-
Vertical spacing between icon and label. Defaults to 4.
final
- iconSize → double
-
Size of tab icons. Defaults to 24.
final
- indicatorBorderRadius → double?
-
Override border radius for the indicator pill. Null = inherits from
barBorderRadius. Use a higher value (e.g. 100) for a fully round
indicator on a more subtly curved bar.
final
- indicatorColor → Color?
-
Base color of the glass indicator. Falls back to theme or a translucent white.
final
- indicatorExpansion → EdgeInsetsGeometry
-
How far the jelly indicator's leading and trailing edges expand
past the tab boundary as the indicator translates between tabs.
Higher values give a more dramatic "puff" stretch; lower values
produce a tighter, more iOS-native feel. Defaults to
14— matches the pre-existing visual.final - indicatorPinchStrength → double
-
Maximum concave lens pinch strength for the draggable indicator pill.
final
- indicatorSettings → LiquidGlassSettings?
-
Custom glass settings for the indicator element.
final
- innerBlur → double
-
Blur amount inside the selected indicator. Defaults to 0.0.
final
- interactionBehavior → GlassInteractionBehavior
-
Controls which physical interaction effects are active when the user
presses the bar.
final
- interactionGlowColor → Color?
-
The color of the directional glow effect when interacting with the bar.
final
- interactionGlowRadius → double
-
The radius spread of the directional glow effect when interacting with the bar.
final
- isSearchActive → bool
-
Whether the search bar is currently expanded.
final
- key → Key?
-
Controls how one widget replaces another widget in the tree.
finalinherited
- labelFontSize → double
-
Font size for tab labels.
final
- magnification → double
-
Magnification factor for the selected indicator lens effect.
final
- maskingQuality → MaskingQuality
-
Rendering quality for the liquid masking effect. Defaults to MaskingQuality.high.
final
- onBarTap → VoidCallback?
-
Called when the user taps anywhere on the bar.
final
-
onBrightnessChanged
→ ValueChanged<
Brightness> ? -
Called when the content-aware verdict flips (not for the initial
value).
final
-
onTabSelected
→ ValueChanged<
int> -
Callback fired when a tab is selected or the draggable indicator is released.
final
- platformViewBackdrop → bool
-
Set true when the bar sits over an iOS PlatformView (e.g. a map). The bar
background renders via live
BackdropFilter(the premium shader can't capture a PlatformView), while the premium indicator refracts the bar's own icons — so premium animations survive over the PlatformView with no quality swap. Defaults to false.final - pressScale → double
-
Peak scale factor applied to the bar at maximum press depth.
final
- quality → GlassQuality?
-
Rendering quality. Inherits from parent or defaults to GlassQuality.premium.
final
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
- scrollController → ScrollController?
-
Scroll controller for the page beneath the bar. Null (the default)
disables the whiten-at-bottom effect — there is no scroll position to
watch.
final
- searchBarHeight → double
-
Height of the pills when search is active. Defaults to
50.0.final - searchConfig → GlassSearchBarConfig
-
Configuration for the morphing search bar behaviour.
final
- selectedIconColor → Color?
-
Icon color when a tab is selected. Defaults to dynamic label color.
final
- selectedIndex → int
-
Index of the currently selected tab (0-based).
final
- selectedLabelColor → Color?
-
Label color for selected tab.
final
- selectedLabelStyle → TextStyle?
-
Per-state label text style, merged over the base label style — overrides
font / weight / letter-spacing while keeping the resolved label color.
final
- settings → LiquidGlassSettings?
-
Custom glass settings. Falls back to identical defaults as GlassBottomBar.
final
- showIndicator → bool
-
Whether to show the draggable indicator. Defaults to
true.final - spacing → double
-
Spacing between adjacent pills. Defaults to 8.
final
- springDescription → SpringDescription?
-
Custom spring physics for the pill morph animation.
final
- tabPadding → EdgeInsetsGeometry
-
Internal padding within the tab pill. Defaults to 4 px horizontal.
final
- tabPillAnchor → GlassTabPillAnchor
-
How the tab pill is anchored horizontally during the morph animation.
final
-
tabs
→ List<
GlassBottomBarTab> -
List of tabs. At least one tab is required.
final
- tabWidth → double?
-
Width of each tab slot in the tab pill.
final
- textStyle → TextStyle?
-
Text style for tab labels. Uses 11 pt w600/w500 when null.
final
- unselectedIconColor → Color?
-
Icon color when a tab is unselected. Defaults to dynamic label color.
final
- unselectedLabelColor → Color?
-
Label color for unselected tabs.
final
- unselectedLabelStyle → TextStyle?
-
See selectedLabelStyle.
final
- verticalPadding → double
-
Vertical padding (top + bottom) around the bar content. Defaults to 20.
final
- whitenAtBottom → bool
-
When true (default), the bar lifts its whitening toward
whitenAtBottomTarget as the scrolled content nears the bottom of the
page, so a light page stays readable through the bar. Light-mode only;
set false to opt out.
final
- whitenAtBottomTarget → double
-
Whiten value the bar lifts to at the bottom. Defaults to 1.0
(fully white).
final
- whitenBottomThreshold → double
-
Distance (logical px) from the scroll bottom within which the bar is
considered "at the bottom" and whitens. Defaults to 45.
final
Methods
-
build(
BuildContext context) → Widget -
Describes the part of the user interface represented by this widget.
override
-
createElement(
) → StatelessElement -
Creates a StatelessElement to manage this widget's location in the tree.
inherited
-
debugDescribeChildren(
) → List< DiagnosticsNode> -
Returns a list of DiagnosticsNode objects describing this node's
children.
inherited
-
debugFillProperties(
DiagnosticPropertiesBuilder properties) → void -
Add additional properties associated with the node.
inherited
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
toDiagnosticsNode(
{String? name, DiagnosticsTreeStyle? style}) → DiagnosticsNode -
Returns a debug representation of the object that is used by debugging
tools and by DiagnosticsNode.toStringDeep.
inherited
-
toString(
{DiagnosticLevel minLevel = DiagnosticLevel.info}) → String -
A string representation of this object.
inherited
-
toStringDeep(
{String prefixLineOne = '', String? prefixOtherLines, DiagnosticLevel minLevel = DiagnosticLevel.debug, int wrapWidth = 65}) → String -
Returns a string representation of this node and its descendants.
inherited
-
toStringShallow(
{String joiner = ', ', DiagnosticLevel minLevel = DiagnosticLevel.debug}) → String -
Returns a one-line detailed description of the object.
inherited
-
toStringShort(
) → String -
A short, textual description of this widget.
inherited
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited