NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #2141 most downloaded on pub.dev
Beautifully designed components from Shadcn/UI is now available for Flutter
Last release 7 days ago
01 Oct 2026
Release timing varies
gaps range from 8 days to 5 months
Nearly every release is documented
notes for 54 of 54 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
54 releases · first in 2024
Rewrite GenUI catalog around standard A2UI
Rewrite GenUI catalog around standard A2UI
gap(double, {double? crossGap}) helper is removed. Use Gap,
SizedBox, Column(...).gap(8), Row(...).gap(8) or DensityGap instead.shadcn_flutter_skeletonizer package.
asSkeleton, Bone and BoneMock come from there now, and you need a
SkeletonizerLayer in the tree. Its README has the three-step migration.CountryFlag renders regional indicator emoji instead of bundled artwork.
Sizing moved from theme: ImageTheme(...) to plain width, height and
shape arguments, fromLanguageCode is gone, and unknown country codes draw
an empty box. Set CountryFlagTheme.builder to supply real artwork, for
example by delegating to package:country_flags.PhoneInputTheme.flagShape takes a ShapeBorder?. Use
RoundedRectangleBorder and CircleBorder in place of RoundedRectangle
and Circle.ShadcnLocalizations.localizationsDelegates is now just
[ShadcnLocalizations.delegate]. The Global*Localizations delegates it used
to include come from the SDK material and cupertino libraries, whose types do
not match the material_ui and cupertino_ui ones the companion packages
use. Add flutter_localizations yourself if you want them, or use
kMaterialLocalizationsDelegates / kCupertinoLocalizationsDelegates from
shadcn_flutter_material and shadcn_flutter_cupertino.ShadcnLocalizations, six messages take a String instead of
a double: formLessThan, formGreaterThan, formLessThanOrEqualTo,
formGreaterThanOrEqualTo, formBetweenInclusively and
formBetweenExclusively. formEqualTo is new and also required. Wrap numbers
in formatDecimal to keep the old output.skeletonizer, country_flags, phonecodes, expressions,
email_validator, web, intl and flutter_localizations dependencies.
The core package now depends only on data_widget, animation_kit and gap.
Country, Countries, Currency, Filter and EmailValidator are still
exported and unchanged, and TextInputFormatters.mathExpression still
accepts the same syntax.Translations for 39 more languages: Arabic, Bengali, Bulgarian, Chinese
(Simplified and Traditional), Czech, Danish, Dutch, Filipino, Finnish,
French, German, Greek, Hebrew, Hindi, Hungarian, Indonesian, Italian,
Japanese, Korean, Malay, Marathi, Norwegian Bokmål, Pashto, Persian, Polish,
Portuguese, Romanian, Russian, Slovak, Spanish, Swedish, Tamil, Telugu, Thai,
Turkish, Ukrainian, Urdu and Vietnamese. Pass
ShadcnLocalizations.supportedLocales to ShadcnApp to opt into all of them.
None have been checked by a native speaker yet, so corrections are welcome.
Right to left locales now mirror the app. Arabic, Hebrew, Persian, Pashto and Urdu all ship.
Region and script variants. zh_Hant ships, and zh_TW, zh_HK and zh_MO
reach it without carrying a script subtag.
Every locale's class is exported, so you can subclass one to reword a single string:
class MyStrings extends ShadcnLocalizationsDe {
@override
String get buttonSave => 'Sichern';
}
A theme: argument on 113 components, taking that component's
ComponentThemeData. It applies to that widget alone and takes precedence
over an ancestor ComponentTheme.
Card(
theme: CardTheme(padding: EdgeInsets.all(8)),
child: const Text('One card'),
)
.inheritStyle(theme) and .resetInheritedStyle() on those same components,
for when you want the whole subtree instead of the one widget, plus
.restoreInheritedStyle(context) to carry a theme into content built
elsewhere, such as an overlay.
ComponentTheme.reset(), which clears the theme of type T for its subtree
so components fall back to their built-in defaults.
Window.theme, for styling one window without touching the navigator's
WindowTheme.
ShadcnLocalizations.textDirection, ShadcnLocalizations.maybeOf and
ShadcnLocalizations.formEqualTo.
formatDecimal for grouping digits, and canonicalizeLocale for normalizing
a locale string.
ShadcnApp.surfaceBuilder and ShadcnLayer.surfaceBuilder, which wrap the
shadcn surface from outside the toast, eye dropper and keyboard shortcut
layers. Use it instead of builder when what you install has to reach overlay
content.
The per property styling arguments on those 113 components: Card's
padding, Avatar's size, Divider's thickness and so on. Pass the
component's theme instead. They still work, and still win over theme:, so
nothing breaks today.
// before
Card(padding: EdgeInsets.all(8), borderRadius: BorderRadius.zero, child: ...)
// after
Card(
theme: CardTheme(
padding: EdgeInsets.all(8),
borderRadius: BorderRadius.zero,
),
child: ...,
)
MaterialShadcnApp and CupertinoShadcnApp install
theirs above the overlay layers now.PinnedSheets no longer swallow taps meant for the
backdrop. A fully closed sheet also stops painting, while a visible sheet
still blocks interaction with controls underneath it.PinnedSheet example is edge-to-edge again, with its
spacing applied inside the sheet instead of around the entire example.CompareWith.equal and CompareTo.equal threw NoSuchMethodError instead of
reporting a validation failure.MenuGap and NavigationGap spaced along the wrong axis inside a horizontal
menu or navigation bar.ColorSchemes.lightZinc(), which does not
compile. ColorSchemes members are constants; the function is on
LegacyColorSchemes.One column per month.
…of the cacheExtent ( double? ) that Flutter deprecated after 3.41.0.
ShadcnPreview builds on package:flutter/widget_previews.dart, whosePreview API only settled in 3.47.0, and this is the version the package ispackage:flutter/widgets.dart only, following Flutter's move of thosematerial_ui and cupertino_ui packages. Two companionshadcn_flutter_material andshadcn_flutter_cupertino.Icons, MaterialPageRoute,MaterialPage, SliverAppBar, FlutterLogo (still available frompackage:flutter/widgets.dart), cupertinoDesktopTextSelectionControls andcupertinoDesktopTextSelectionHandleControls.ShadcnApp.materialTheme and ShadcnApp.cupertinoTheme removed. UseMaterialShadcnApp.materialTheme / CupertinoShadcnApp.cupertinoTheme, orMaterialLayer / CupertinoLayer directly.ShadcnApp.debugShowMaterialGrid renamed to ShadcnApp.debugShowGrid; itGridPaper, which was never Material-specific.ShadcnApp no longer installs Material, ScaffoldMessenger, ThemeCupertinoTheme ancestors, nor the DefaultMaterialLocalizationsDefaultCupertinoLocalizations delegates. Material and Cupertino widgetsShadcnApp will now assert; wrap them in aMaterialLayer / CupertinoLayer, or use MaterialShadcnApp /CupertinoShadcnApp.TextField.nativeContextMenuBuilder(),TextField.materialContextMenuBuilder() andTextField.cupertinoContextMenuBuilder(). Their replacements are thebuildAdaptiveEditableTextContextMenu andbuildMaterialEditableTextContextMenu in shadcn_flutter_material, andbuildCupertinoEditableTextContextMenu in shadcn_flutter_cupertino.SelectableText.useNativeContextMenu. Pass contextMenuBuildercross_file dependency and the XFile re-export that came withcross_file directly if youXFile through package:shadcn_flutter.uses-material-design is no longer set by this package, so the MaterialIconsflutter create already set it to true. Leave it on if you useshadcn_flutter_material, or if you use CountryFlag, which falls back to aShadcnPageRoute and ShadcnPage, Material-free replacements forMaterialPageRoute and MaterialPage. ShadcnPageRoute is the default routeShadcnApp builds for routes and home.shadcnTextSelectionHandleControls, the handle-less TextSelectionControlsbuildEditableTextContextMenu.SpellCheckSuggestionsToolbar, a shadcn styled replacement for the MaterialTextField.ShadcnLocalizations.noSpellCheckReplacements.Table.textDirection and ResizableTable.textDirection,Directionality. Column indices stay logical, socolumnWidths key 0 and FrozenTableData.frozenColumns index 0 still meanSelect.decoration, MultiSelect.decoration andSelectTheme.decoration, a WidgetStatePropertyDelegate<Decoration> thatWidgetState. One delegate coversTheme scope around the whole subtree. Applied afterborderRadius, so it can override that too.SelectPopup.builder() now takes shrinkWrap, for paritySelectPopup(), so a popup whose delegate mixes items with a trailingSelectPopupHandle.close(), letting a widget inside theonChanged firing.WidgetStatePropertyResolver and WidgetStatePropertyDelegate, theButtonStateProperty andButtonStatePropertyDelegate. The Button* names remain as aliases.Positioned.directional, which the patched Positioned was missing relativelerpColorPremultiplied, an alpha-correct alternative to Color.lerp forRenderScrollableClientViewport takes scrollCacheExtentScrollCacheExtent?) instead of the cacheExtent (double?) thatChatReaction,ChatReactionTheme, ChatReactionContainer, ChatCollapsible,FocusToFront, ExpandedFocusToFront, FlexibleFocusToFront,DialogOverlayContent, buildShadcnDialogTransitions, DynamicFormKeydarken/lighten color extensions.synthetic-package key from l10n.yaml; leaving itflutter pub get delete the generated localization sources.CircularProgressIndicator now paints its arc directly instead of wrappingSelectableText is now implemented in this package on top of EditableTextSelectableText. Cursor and selection colorsSelectableTextTheme.Icons now use the bundledLucideIcons set: ColorPicker, TimePicker, Accordion, Collapsible,Stepper, Tree, Window and RefreshTrigger.builder now lives in the showOverlay method signature instead of OverlayConfiguration.Select, AutoComplete, ObjectFormField, FormattedObjectInput, showItemPicker, NavigationMenu, Tooltip, InstantTooltip, and HoverCard) now have been migrated to use OverlayConfiguration instead of OverlayHandler.ShadcnApp and ShadcnLayer no longer take popooverHandler/tooltipHandler/menuHandler.adaptiveOverlay is now set to false.OverlayHandler, OverlayManager, OverlayManagerLayer, and *OverlayHandler from internal use.bool? adaptiveOverlay and OverlayConfiguration? overlayConfiguration now lives in overlay component's component themes.DrawerContainer.intrinsic and DrawerContainer.expands is moved to PinnedSheet.contentExpands and DrawerContainer.contentIntrinsicHSVColorSliderPainter and HSLColorSliderPainter now paint with layeredDecoration.lerp blends with Color.lerp, which interpolateslerpColorPremultiplied.InputFeature.revalidate() cleared the error instead of recheckingFormFieldHandle.revalidate passed the field's internal cache wrapperTypeError. ConditionalValidator, NotValidator, OrValidator andCompositeValidator tested other is ConditionalValidator against the rawT-typed member off it forced a downcast to the dynamicT? cannot satisfy.SideSheet inside a vertical BottomSheet) no longer leakEyeDropperLayer wraps the whole application and expanded the entire windowList<Color> — one object per pixel, so several million onRangeError; positions are now clamped to the snapshot.IgnorePointer withui.Image and decodedsatAlpha, valAlpha and hueAlpha sliders did notScrollableClient never updated its viewport render object, becauseScrollableClientViewport supplied no updateRenderObject and inherited theScrollableClient.builder wasoverscroll, clipBehavior and reverse could not beshadcn_flutter.shadcn_flutter when that package dropped itsMaterialShadcnApp, a drop-in replacement for ShadcnApp that registers theMaterial andScaffoldMessenger ancestors.MaterialLayer, the same ancestors for a single subtree, plusmaterialThemeFor and kMaterialLocalizationsDelegates.buildAdaptiveEditableTextContextMenu,buildMaterialEditableTextContextMenu andbuildMaterialSpellCheckSuggestionsToolbar, replacingTextField.nativeContextMenuBuilder() andTextField.materialContextMenuBuilder().Icons, MaterialPage, MaterialPageRoute and SliverAppBar,shadcn_flutter used to re-export itself.shadcn_flutter.shadcn_flutter when that package dropped itsCupertinoShadcnApp, a drop-in replacement for ShadcnApp that registers theCupertinoTheme ancestor.CupertinoLayer, the same theme for a single subtree, pluscupertinoThemeFor and kCupertinoLocalizationsDelegates.buildCupertinoEditableTextContextMenu andbuildCupertinoSpellCheckSuggestionsToolbar, replacingTextField.cupertinoContextMenuBuilder().CupertinoIcons, CupertinoPage, CupertinoPageRoute and theshadcn_flutter used to re-export.All three published to pub.dev at 0.0.54:
See the Material/Cupertino guide
for the full migration table.
Deprecated direct BuildContext context parameter across all overlay/popup functions (such as showPopover , openDrawer , openSheet , etc.) in favor of…
OverlayAnchor and aOverlayAnchorRegistry to support anchoring overlaysSymbol keys.anchor parameter (Symbol?) to:
showPopover and PopoverController.showopenDrawer, openSheet, openRawDrawer, openDrawerOverlay, andopenSheetOverlay This eliminates the need to use Builder widgets to wrapBuildContext forfindRenderObject().shadcn_flutter_genui package: Added a new companion package to theDecoratedChipClipboardHandler and improved ChipInput clipboardBuildContext context parameter across all overlay/popupshowPopover, openDrawer, openSheet, etc.) in favor ofanchor (Symbol?).TreeView to Tree (breaking): update usages of TreeView andTree name.paintOrder nullable.InputOTP border and paint order._DoubleOnlyFormatter not0.00N input cases (PR #403 by @petertle22).Clickable decorationBuilder widget usages in documentation,Sortable losing/incorrectly tracking its state, and fixedDivider rendering inside a vertically-unbounded parent.Stepper line alignment.ButtonGroup.AutoComplete overlay behavior.[#400] Fixed DatePicker resetting its view back to the current month after selecting a date in another month.
Fixed NavigationSidebar not working correctly after recent breaking changes
Add min/max limits to increment/decrement input buttons and disable at bounds
int) toKey?) across NavigationBar, NavigationRail, andNavigationSidebar (commits 53d2d8c, 8d3104a, 9ef28a8)
index parameter removed; use selectedKey insteadonSelected callback signature changed from ValueChanged<int>? toValueChanged<Key?>?NavigationItem.index parameter removed; use the widget's key forNavigationBarItem abstract class removed; children parameters nowList<Widget> instead of List<NavigationBarItem>NavigationContainerMixin (and its wrapChildren method) removedNavigationChildControlData and NavigationGroupControlDataNavigationBar.constraints parameter removed; use expandedSizecollapsedSize insteadNavigationBar parameters changed from nullable with themealignment (NavigationBarAlignment? → NavigationBarAlignment, default:start)labelType (NavigationLabelType? → NavigationLabelType, default: all)labelPosition (NavigationLabelPosition? → NavigationLabelPosition,bottom)labelSize (NavigationLabelSize? → NavigationLabelSize, default:small)expanded (bool? → bool, default: false)NavigationBar.expands parameter removedNavigationGap, NavigationDivider, NavigationLabel, andNavigationWidget no longer implement NavigationBarItemMigration guide:
index / onSelected with selectedKey / key-based callback.// before
NavigationBar(
index: selectedIndex,
onSelected: (index) => setState(() => selectedIndex = index),
children: [
NavigationItem(label: Text('Home'), child: Icon(Icons.home)),
NavigationItem(label: Text('Search'), child: Icon(Icons.search)),
],
)
// after
NavigationBar(
selectedKey: selectedKey,
onSelected: (key) => setState(() => selectedKey = key),
children: [
NavigationItem(key: ValueKey('home'), label: Text('Home'), child: Icon(Icons.home)),
NavigationItem(key: ValueKey('search'), label: Text('Search'), child: Icon(Icons.search)),
],
)NavigationBarItem type annotations; use Widget instead.NavigationContainerMixin, NavigationChildControlData,NavigationGroupControlData.NavigationBar(constraints: ...) with expandedSize /collapsedSize.int) to
key-based (Key?) across NavigationBar, NavigationRail, and
NavigationSidebar (commits 53d2d8c3, 8d3104a9, 9ef28a81)
index parameter removed; use selectedKey insteadonSelected callback signature changed from ValueChanged<int>? to
ValueChanged<Key?>?NavigationItem.index parameter removed; use the widget's key for
selection identityNavigationBarItem abstract class removed; children parameters now
accept List<Widget> instead of List<NavigationBarItem>NavigationContainerMixin (and its wrapChildren method) removedNavigationChildControlData and NavigationGroupControlData
classes removedNavigationBar.constraints parameter removed; use expandedSize
and collapsedSize insteadNavigationBar parameters changed from nullable with theme
fallback to non-nullable with explicit defaults:
alignment (NavigationBarAlignment? → NavigationBarAlignment, default:
start)labelType (NavigationLabelType? → NavigationLabelType, default: all)labelPosition (NavigationLabelPosition? → NavigationLabelPosition,
default: bottom)labelSize (NavigationLabelSize? → NavigationLabelSize, default:
small)expanded (bool? → bool, default: false)NavigationBar.expands parameter removedNavigationGap, NavigationDivider, NavigationLabel, and
NavigationWidget no longer implement NavigationBarItemMigration guide:
index / onSelected with selectedKey / key-based callback.// before
NavigationBar(
index: selectedIndex,
onSelected: (index) => setState(() => selectedIndex = index),
children: [
NavigationItem(label: Text('Home'), child: Icon(Icons.home)),
NavigationItem(label: Text('Search'), child: Icon(Icons.search)),
],
)
// after
NavigationBar(
selectedKey: selectedKey,
onSelected: (key) => setState(() => selectedKey = key),
children: [
NavigationItem(key: ValueKey('home'), label: Text('Home'), child: Icon(Icons.home)),
NavigationItem(key: ValueKey('search'), label: Text('Search'), child: Icon(Icons.search)),
],
)
NavigationBarItem type annotations; use Widget instead.NavigationContainerMixin, NavigationChildControlData,
or NavigationGroupControlData.NavigationBar(constraints: ...) with expandedSize /
collapsedSize.Fixed clip behavior in paint order patched layout widgets (Flex, Row, Column, Stack)
New ColorScheme.of method to access color scheme from theme data
ColorScheme.of method to access color scheme from theme dataShadcnPreview and ShadcnMultiPreview annotation to previewDensity,EdgeInsetsDensity)Flex, Row, Column, and Stack withPaintOrder and Positioned.paintOrderInputStepperButtonFeature and support forInputFeaturePosition.above/belowDivider.childAlignment to align divider contentWidget.sized(size:) convenience overloadFadedScrollableViewport helper for scroll fade masksColorSchemeRepeatMode has been renamed to LoopingModeShadcnLocalizationsDelegate.delegate has been renamed toShadcnLocalizations.delegateMigration guide:
ColorScheme.sidebar, sidebarForeground,sidebarPrimary, sidebarPrimaryForeground, sidebarAccent,sidebarAccentForeground, sidebarBorder, and sidebarRing.background, card, oraccent) or create a custom theme extension if you still need// before
final colors = Theme.of(context).colorScheme;
final bg = colors.sidebar;
// after
final colors = Theme.of(context).colorScheme;
final bg = colors.background; // or a custom ThemeExtensionComplete ColorSchemeRecolorExtension palette getters
[#380] Fixed issue with DatePicker when using PromptMode.popover
[#379] Fixed issue with intrinsic row height in Table component
[#378] Fixed issue with RepeatMode declaration in flutter master channel
[#373] Scaffold: Set height constraints to correctly measure header size (by
@xdidx)
[#394] Fixes ButtonStyle.withPadding by removing shadowed variable (by @craiglabenz)
Brought back color picker history panel
Breaking changes
lib/src/components/form/color_picker.dart into multiple focused fileslib/src/components/form/color/solid/.package:shadcn_flutter/shadcn_flutter.dart) continues to work but theallowPickFromScreen ➜ enableEyeDropperonPickFromScreen ➜ onEyeDropperRequestedHSVColorPickerArea / HSLColorPickerArea replaced by exportedHSVColorSlider / HSLColorSlider.AlphaPainter (replaces ad-hocColorPickerSet, MiniColorPickerSet, andColorInput +ColorPicker with prompt modes.Color system and utilities
ColorDerivative or colorToHex. Added gradientColor Picker
onChanging/onChanged and consistent display using anColorPickerTheme.Color Input
ColorInput widget with ColorInputController and theming. IntegratesControlledColorInput variant for form integration.Eye Dropper and History
pickColorFromScreen and ColorPickingLayer)RecentColorsScope andColorHistoryGrid to persist and pick previously sampled colors.API exports
i18n and formatting
colorPickerTabHEX localization key and TextInputFormatters.hexColor picker refactor and file layout
Breaking changes
lib/src/components/form/color_picker.dart into multiple focused files
under lib/src/components/form/color/solid/.package:shadcn_flutter/shadcn_flutter.dart) continues to work but the
old internal path is removed.allowPickFromScreen ➜ enableEyeDropperonPickFromScreen ➜ onEyeDropperRequestedHSVColorPickerArea / HSLColorPickerArea replaced by exported
HSVColorSlider / HSLColorSlider.AlphaPainter (replaces ad-hoc
checkboard usage in the old file).ColorPickerSet, MiniColorPickerSet, and
popup/dialog variants were removed in favor of ColorInput +
ColorPicker with prompt modes.Color system and utilities
ColorDerivative or colorToHex. Added gradient
types (linear, radial, sweep) for future composition.Color Picker
onChanging/onChanged and consistent display using an
effective in-progress value.ColorPickerTheme.Color Input
ColorInput widget with ColorInputController and theming. Integrates
popover/dialog prompting, optional HEX label display, orientation, and
EyeDropper integration. ControlledColorInput variant for form integration.Eye Dropper and History
pickColorFromScreen and ColorPickingLayer)
with magnified preview and label; added RecentColorsScope and
ColorHistoryGrid to persist and pick previously sampled colors.API exports
i18n and formatting
colorPickerTabHEX localization key and TextInputFormatters.hex
(supports optional hash prefix) for safe HEX input. If you provide a custom
localization, add this new key.Removed NumberInput (previously deprecated) and its export. Migrate to TextField with InputSpinnerFeature or to FormattedInput depending on your use c…
Breaking changes
Inputs
Components
Theming and platform
Fix: Sortable onDragEnd not triggered when the drag failed
- Exported FocusOutline
Updated dependencies
Added AnimatedValueBuilder documentation
Clickable no longer handles Semantics
Fixed ButtonStyleOverride being discarded after Button dependency update
Added component tiles for various UI elements (major documentation improvement)
Fix PhoneInput initialValue not being passed
Added native (adaptive) context menu builder for TextField
Added RadioCardThemeData (by @mcquenji)
FormFieldHandle#reportNewFormValue to handle
typed-null valueExcluded web loaders directory from package release
Added showValuePredicate parameter to Select, MultiSelect, ControlledSelect, and ControlledMultiSelect
Fixed Password Toggle Input Feature
Fixed TimePicker text field vertical align
Fixed incorrect MultiSelectKey FormKey type
Properly bundled Geist and Geist Mono fonts
Added no virtualization mode on Select and MultiSelect Popup
Removed deprecated withOpacity usage
Tabs, TabList, and TabPane are now based on the new TabContainer
Fixed flutter dependency version constraint
Fixed resizing issues with Resizable component
Added leading and trailing to form title
Fixed issue with Form Validation Mode lifecycle
Replaced photoUrl to image provider in Avatar component
- Fixed test issue
Added Linear Progress component
Fixed color shades generation issue
Fixed bug with data not being bound to popover context
Added support for Material/Cupertino widgets
Removed Popover, PopoverLayoutDelegate, PopoverExtension, and PopoverPortal
Fixed platform interface initialization
- Added Resizable component - Added Menubar component - Refactored ComboBox to Select - Added Context Menu component - Added Dropdown Menu component
- Fixed missing icons directory
- Fixed icon visual glitch
- Fixed duplicate widget entries
- Updated installation guide
- Fix broken links in README.md
- Updated README.md
Fix platform support for windows, android, macos, linux, and ios
Split into 3 packages: shadcn_flutter, shadcn_flutter_web, and shadcn_flutter_platform_interface
Overhauled the button component and the badge component
- Added missing components - Improved documentation pages
- Initial release
Your coding agent can read these notes before it upgrades. Set up the MCP server →