NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #2077 most downloaded on pub.dev
Implements Microsoft's Windows User Interface in Flutter.
Last release 1 months ago
03 Aug 2026
Release timing varies
gaps range from 2 weeks to 5 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
130 releases · first in 2021
One column per quarter.
DropDownButtonItem is deprecated. MenuFlyoutItem should be used instead
Reworked DropDownButton (#297):
DropDownButton now uses Flyout and MenuFlyout to display the menuMenuFlyoutMenuFlyout content height is now properly calculated (Fixes #210)DropDownButtonItem is deprecated. MenuFlyoutItem should be used insteadDropDownButton.buttonBuilder, which is able to style the button as you wish. DropDownButton.buttonStyle is now deprecatedDropDownButton(
items: [...],
// onOpen should be called to open the flyout. If onOpen is null, it means the button
// should be disabled
buttonBuilder: (context, onOpen) {
return Button(
...,
onPressed: onOpen,
);
}
)
TextButton now uses textButtonStyle instead of outlinedButtonStyle
Add TextFormBox.decoration (#312)
Implemented FlyoutPosition, which controls where the flyout will be opened according to the child. It can be above, below or side
MenuFlyout (#266)
FlyoutPosition, which controls where the flyout will be opened according to the child. It can be above, below or sideFlyoutOpenMode.longHover, which makes possible to open the flyout when the user performs a long hoverFlyout.onOpen and Flyout.onClose. Some convenience callbacks that are called when the flyout is opened or closed, respectivelyPopupContentSizeInfo, which provides the information about the content sizeMenuFlyoutItem, MenuFlyoutSeparator and MenuFlyoutSubItem. They are used inside MenuFlyout to render the menu itemshorizontalPositionDependentBox is now globally available for use as a top functionNavigationView for top mode (#277)InfoBadge now is correctly positioned on top mode (#296)Do not use duplicated Scrollbars
Scrollbars (#279)NavigationPane header. (#260)TextFormBox.expands now works properly ([#291]](https://github.com/bdlukaa/fluent_ui/pull/291))TextBox is no longer duplicated (#290)NavigationView without pane no longer throws error
NavigationView without pane no longer throws error (#276)Fix overflow behavior for TreeViewItem
Improves icons.dart formatting and its generation
Improves icons.dart formatting and its generation (#215)
Use correct color on FilledButton when disabled (209)
Built-in support for new languages (#216):
Add useInheritedMediaQuery property to FluentApp (#211)
TreeView updates (#255):
shrinkWrap to falsevalue field)onSelectionChanged callback, called when the selection is changedAccount for enabled on pressing states (#233)
Implement CommandBar (#232)
DynamicOverflow layout widget, for one-run horizontal or vertical layout with an overflow widgetHorizontalScrollView helper widget, with mouse wheel horizontal scrollingLong content widget no longer overflow in ContentDialog (#242)
Content state is no longer lost when the pane display mode is changed (#250)
BREAKING Update indicators (#248):
Added InheritedNavigationView
Updated sticky indicator to match the latest Win 11 UI (#173)
BREAKING Renamed NavigationPane.indicatorBuilder to NavigationPane.indicator
BREAKING Indicators are no longer built with functions Before:
indicatorBuilder: ({
required BuildContext context,
required NavigationPane pane,
required Axis axis,
required Widget child,
}) {
if (pane.selected == null) return child;
assert(debugCheckHasFluentTheme(context));
final theme = NavigationPaneTheme.of(context);
final left = theme.iconPadding?.left ?? theme.labelPadding?.left ?? 0;
final right = theme.labelPadding?.right ?? theme.iconPadding?.right ?? 0;
return StickyNavigationIndicator(
index: pane.selected!,
pane: pane,
child: child,
color: theme.highlightColor,
curve: Curves.easeIn,
axis: axis,
topPadding: EdgeInsets.only(left: left, right: right),
);
}
Now:
indicator: StickyNavigationIndicator(
color: Colors.blue.lighter, // optional
),
initiallyExpanded property on Expander works properly (#252)
BREAKING Flyout changes:
Flyout.contentWidth and added FlyoutContent.constraints. Now the content will be automatically sized and layed out according to the placementFlyout.placement which takes a FlyoutPlacementFlyout.openMode which takes a FlyoutOpenModeFlyout.controller is no longer required. If not provided, a local controller is created to handle the Flyout.openMode settingsFlyoutController.open is now a functionFlyoutController.isOpen, FlyoutController.isClosed, FlyoutController.close(), FlyoutController.open() and FlyoutController.toggle()Popup.contentHeightBREAKING Updated typography (#261):
Typography.standart to Typography.fromBrightnessTypography constructor to Typography.rawconst Color(0xE4000000)display, titleLarge, title and subtitleTabWidthBehavior.sizeToContent now works properly (#218)
Correctly apply the style property
TextBox updates: (#179)
style propertydecoration to the backgroundforegroundDecoration and highlightColor property. They can not be specified at the same timemaxLengthEnforeced with maxLengthEnforcementTextFormBoxAutoSuggestBox updates:
DropDownButton overlay (#182)NavigationPane is not provided on NavigationView (#187)NavigationAppBar.actions are rendered on the top of the other widgets (#177)ComboBox overlaymenuColor for theme, which is now used by dropdown button, auto suggest box, tooltip and content dialogCard and cardColor for themeSelectableText (#196)BREAKING Renamed standartCurve to standardCurve
BREAKING Renamed standartCurve to standardCurve
BREAKING Completly rework DropDownButton
BREAKING Removed CheckboxThemeData.thirdStateIcon
Currently, there isn't a fluent icon that is close to the native icon. A local widget _ThirdStateDash is used
Do not override material Theme on FluentApp (#155)
Slider thumb now doesn't change inner size if hovered while disabled
Uniform foreground color on Checkbox
Updated FilledButton Style
ToggleButton and FilledButton now share the same style
ScaffoldPage.scrollable and ScaffoldPage.withPadding
Ensure we use Typography.body as the default text style on BaseButton (#120)
Update ButtonThemeData.uncheckedInputColor
Added Material Theme to Fluent Theme Builder
Tests (#142)
Added Material Theme to Fluent Theme Builder (#133)
NavigationView updates BREAKING:
PaneItem in top mode (#143)NavigationIndicator.end and NavigationIndicator.stickyCurves.easeIn for sticky navigation indicator by defaultEntrancePageTransition is now the correct page transition used when display mode is topPaneItem when display mode is topNavigationPane.defaultNavigationIndicatoroffsets and sizes with pane in NavigationPaneBefore:
pane: NavigationPane(
indicatorBuilder: ({
required BuildContext context,
/// The navigation pane corresponding to this indicator
required NavigationPane pane,
/// Corresponds to the current display mode. If top, Axis.vertical
/// is passed, otherwise Axis.vertical
Axis? axis,
/// Corresponds to the pane itself as a widget. The indicator is
/// rendered over the whole pane.
required Widget child,
}) {
if (pane.selected == null) return child;
assert(debugCheckHasFluentTheme(context));
final theme = NavigationPaneThemeData.of(context);
axis??= Axis.horizontal;
return EndNavigationIndicator(
index: pane.selected,
offsets: () => pane.effectiveItems.getPaneItemsOffsets (pane.paneKey),
sizes: pane.effectiveItems.getPaneItemsSizes,
child: child,
color: theme.highlightColor,
curve: theme.animationCurve ?? Curves.linear,
axis: axis,
);
},
),
Now:
pane: NavigationPane(
indicatorBuilder: ({
required BuildContext context,
/// The navigation pane corresponding to this indicator
required NavigationPane pane,
/// Corresponds to the current display mode. If top, Axis.vertical
/// is passed, otherwise Axis.vertical
required Axis axis,
/// Corresponds to the pane itself as a widget. The indicator is
/// rendered over the whole pane.
required Widget child,
}) {
if (pane.selected == null) return child;
assert(debugCheckHasFluentTheme(context));
final theme = NavigationPaneThemeData.of(context);
return EndNavigationIndicator(
index: pane.selected,
pane: pane,
child: child,
color: theme.highlightColor,
curve: theme.animationCurve ?? Curves.linear,
axis: axis,
);
},
),
It gets opened automatically when it gets focus
AutoSuggestBox: (#130)
It gets opened automatically when it gets focus
When an item is tapped, the cursor is positioned correctly at the end of the text
BREAKING Now it's not possible to assign a type to AutoSuggestBox:
Before:
AutoSuggestBox<String>(...),
Now:
AutoSuggestBox(...),
Added TextFormBox witch integrates with the Form widget. It has the ability to be validated and to show an error message.
New FluentIcons gallery showcase in example project (#123)
Updated FluentIcons as per 30/12/2021
BREAKING Renamed FluentIcons.close to FluentIcons.chrome_close
Fixed rounded corners on the ComboBox widget
Fixed missing padding before close button on TabView (#122)
Readded tab minimal size for equal and sizeToContent tab width behaviours (#122)
TabView's close button now uses SmallIconButton
If a tab is partially off the view, it's scrolled until it's visible
Fix IconButton's icon size
Update OutlinedButton, FilledButton and TextButton styles
Implement lazy tree view (#139)
Fix scroll buttons when there are too many tabs in TabView
TreeView (#120)Tooltip.useMousePositionSlider and RatingBar (#116)TabView (#92)TabView (#90)TabView (#91)newTabLabel, closeTabLabel, scrollTabBackward, scrollTabForward to FluentLocalizationsTabView's text when it's too long. Now it's clipped when overflow and line doesn't breakTabView.closeButtonVisibility. Defaults to CloseButtonVisibilityMode.alwaysTabView.tabWidthBehavior. Defaults to TabWidthBehavior.equalTabView.header and TabView.footerSlider's mouse cursor is now [MouseCursor.defer]SmallIconButton, which makes an [IconButton] small if wrapped. It's used by TextBoxButtonStyle.iconSizeAutoSuggestBox updates:
FluentLocalizations.noResultsFoundLabel. "No results found" is the default textitemBuilder, sorter, noResultsFound, textBoxBuilder, defaultNoResultsFound and defaultTextBoxBuilderonChanged, trailingIcon, clearButtonEnabled and placeholdercontroller is now nullable. If null, an internal controller is cretedBREAKING Removed ThemeData.inputMouseCursor
ThemeData.inputMouseCursorcursor from DatePicker, TimePicker, ButtonStyle, CheckboxThemeData, RadioButtonThemeData, SliderThemeData, ToggleSwitchThemeData, NavigationPaneThemeDataPaneDisplayMode is toptriggerMode and enableFeedback to Tooltip.Tooltip.dismissAllToolTipsExpander now properly disposes its resources
Expander now properly disposes its resourcesborderRadius and shape attributes to the Mica widgetDropDownButton (#85)BREAKING Minimal Flutter version is now 2.8
ContentDialog constraints can now be customizable
ContentDialog constraints can now be customizable (#86)DisableAcrylic (#89)onReaorder null exception (#88)InfoBadgeExpander (#85)inputMouseCursor is now MouseCursor.deferNavigationView.contentShape is now rendered at the foregroundProgressRing now spins on the correct direction
ProgressRing now spins on the correct direction (#83)backwards property to ProgressRingFluentApp.builder now works as expected (#84)NavigationPane.customPane, which now gives you the ability to create custom panes for NavigationViewsizes, offsets and index parameters from NavigationIndicatorBuilder were replaced by paneBack button now isn't forced when using top navigation mode
Added missing parameters in _FluentTextSelectionControls methods
_FluentTextSelectionControls methods (#67)BREAKING Renamed header -> display
header -> displaysubHeader -> titleLargebase -> bodyStrongbodyLargeSplitButton designIconButton designToggleSwitch not showing expanded thumb mode when draggingCheckboxListTile, RadioListTile and SwitchListTile. Use the respective widget with the content propertyBREAKING: Acryic is not used anymore. Consequently, useAcrylic method was removed.
ToggleButton design.Button design.RadioButton design.ContentDialog design.NavigationView design:
useAcrylic method was removed.Mica, used by the new NavigationViewTooltip.displayHorizontally to true to enable it.Checkbox designToggleSwitch designScrollbar designSlider designInfoBar designCombobox, DatePicker and TimePicker)Implement Fluent Selection Controls for TextBox
BREAKING: Material Icons are not used anymore. Use FluentIcons instead.
Icons are not used anymore. Use FluentIcons instead.Acrylic widget implementation (#47)useAcrylic property from NavigationView. Acrylic is now used by default.PaneDisplayMode.compact has now a width of 40, not 50.SizeTransition from TabView.Option to set a default font family on the theme data (ThemeData.fontFamily)
ThemeData.fontFamily)indicatorBuilder is correctly applied to the automatic display mode in NavigationViewPaneItems' build method is now overridable. You can know customize how the items in NavigationView should look like by overriding the method.
BottomNavigationBottomSheetChipSnackbarPillButtonBarFillButtonOutlinedButtonTextButtonPaneItems' build method is now overridable. You can know customize how the items in NavigationView should look like by overriding the method.Settings pageCorrectly apply items positions to pane indicators, regardless of external factors, such as navigation view app bar
NavigationIndicators performanceBREAKING CHANGES: Reworked the theme api (#39):
BREAKING CHANGES: Reworked the theme api (#39):
Removed the theme extension (context.theme). Use FluentTheme.of(context) instead
ButtonState is now a class that can receive a value. It now allows lerping between values, making AnimatedFluentTheme possible.
Here's an example of how to migrate your code:
Before: cursor: (_) => SystemMouseCursors.click,
Now: cursor: ButtonState.all(SystemMouseCursors.click),
All theme datas and AccentColor have now a lerp method, in order to make AnimatedFluentTheme possible.
Implemented AnimatedFluentTheme, in order to replace AnimateContainers all around the library
Dedicated theme for each theme data (#37):
DividerThemeData now has verticalMargin and horizontalMargin instead of an axis callback.
Updated button colors.
Removed animationDuration and animationCurve from theme datas (except from NavigationPaneThemeData).
Renamed copyWith to merge on theme datas (except from ThemeData)
Fixed typo standart -> standard
Implement AnimatedAcrylic
Minimal flutter version is now 2.2
FluentScrollBehavior, that automatically adds a scrollbar into listviews (#35)New way to disable the acrylic blur effect. Just wrap the acrylic widget in a NoAcrylicBlurEffect to have it disabled.
NoAcrylicBlurEffect to have it disabled.NavigationPanel and Scaffold were removed. Use NavigationView and ScaffoldPage insteadFIX Reworked the combo box widget to improve fidelity.
HoverButton focus management.BREAKING InfoHeader was renamed to InfoLabel. You can now set if the label will be rendered above the child or on the side of it.
InfoHeader was renamed to InfoLabel. You can now set if the label will be rendered above the child or on the side of it.RadioButton inner color overlaping the border.ThemeData.inputMouseCursorFIX CheckboxListTile, SwitchListTile and RadioListTile now doesn't focus its leading widget.
CheckboxListTile, SwitchListTile and RadioListTile now doesn't focus its leading widget.TabView is now not scrollableAcrylic blur effect being disabled by default.ContentDialog transition fidelityFocusBorder for some widgets. It was affecting layout when it shouldn'tRatingBar and Slider weren't working due to FocusBorderSlider thumbNEW FocusBorder.renderOutside. With this property, you can control if the FocusBorder will be rendered over the widget or outside of it.
FocusBorder.renderOutside. With this property, you can control if the FocusBorder will be rendered over the widget or outside of it.RadioButtons border when focusedColor.resolve now doesn't throw a stack overflow error.Color.resolveFromBrightness. This is only available on AccentColordarkest and lightest colors variants in AccentColorInfoBar's error icon. It now uses Icons.cancel_outlined instead of Icons.closeNavigationPanel now has a Scrollbar and the bottom property is now properly styled if selectedFIX TabView tabs can now be reordered (Fixes #10)
TabView tabs can now be reordered (Fixes #10)Tab is added, its now animatedFocusBorder now doesn't change the size of the widgetsbuttonCursor, uncheckedInputColor and checkedInputColor are now moved to ButtonThemeData as static functions.FIX Fixed diagnostic tree. (Fixes #17)
TappableListTile now changes its color when focused instead of having a borderAcrylic's blur effect fidelityAcrylic's elevation was being applying marginThemeData.shadowColor, which is now used by AcrylicAcrylic.acrylicEnabledThe whole theme implementation was reworked on this change.
The whole theme implementation was reworked on this change.
Theme to FluentThemeFluentTheme now can't be nullStyle occurrences to ThemeDataThemeData.accentColor is now an AccentColorThemeData.tooltipStyledebugCheckHasFluentTheme has now a better error messageFluentApp now doesn't throw an error if no theme is providedScrollbar to improve fidelity.Color.toAccentColor and Color.basedOnLuminanceButton.builderNEW In TabView, it's now possible use the following shortcuts if TabView.shortcutsEnabled is true (Follows this):
TabView, it's now possible use the following shortcuts if TabView.shortcutsEnabled is true (Follows this):
Ctrl + F4 or Ctrl + W to close the current tabCtrl + T to create a new tab1-8 to navigate to a tab with the pressed number9 to navigate to the last tab and navigate to the last tabIconButton.autofocus, ToggleButton.autofocussemanticsLabel to semanticLabelNEW Colors showcase page in example app
Colors.warningPrimaryColorColors.warningSecondaryColorColors.errorPrimaryColorColors.errorSecondaryColorColors.successPrimaryColorColors.successSecondaryColorColors.accentColors) with darkest, dark, normal, light and lighterColors.blue is now an AccentColorRemoved Button.icon and Button.trailingIcon
Checkbox.autofocusButton refactor:
Button.icon and Button.trailingIconButton.text to Button.childenabled to falseNavigationPanelBody.animationCurve and NavigationPanelBody.animationDurationNEW Scrollbar and ScrollbarStyle
Scrollbar and ScrollbarStyleFluentApp to not depend of material anymore.FIX Updated Icon widget to use Flutter's default icon widget
Icon widget to use Flutter's default icon widgetFIX Improved ListTile sizing (#Spacing)
ListTile sizing (#Spacing)FocusStyle and support for glow focusRatingBar.starSpacingFIX Animation when using NavigationPanelBody now works as expected
NavigationPanelBody now works as expectedCheckboxListTile, SwitchListTile and RadioListTileTextBoxFIX The mouse cursor in a disabled input is now basic instead of forbidden
basic instead of forbiddenNavigationPanelBody now doesn't use a IndexedStack under the hood because it was interfering in the focus scopeStyle.inactiveColorRadioButton's cursor was not being applied correctlyButton.toggleHoverButton was being focused when it shouldn't beTimePicker.minuteIncrementFIXED Fixed the possibility to give a elevation lower than 0 in Acrylic
AcrylicRatingBar using the keyboard arrowsBREAKING CHANGE Uses the material icon library now
Added the missing Diagnostics
Updated all the screenshots
BREAKING CHANGE Uses the material icon library now
DEVELOPER NOTE This was a hard choice, but the material icon library is a robust, bigger library. It contains all the icons the previous library has, and a few many more.
BREAKING Removed Pivot because it's deprecated
Added Diagnostics to many widgets
NEW AutoSuggestBox (Follows this)
NEW Flyout and FlyoutContent (Folllows this)
FIXED Popup was being shown off-screen.
DEVELOPER NOTE The solution for this was to make it act like a tooltip: only show the popup above or under the child. This was a hard choice, but the only viable option that would work on small screens/devices. This also made Flyout easier to implement. This should be changed when multi-window support is available.
FIXED DatePicker incorrectly changing hour
NEW Colors.accentColors
Documentation about system_theme
BREAKING Removed Pivot because it's deprecated
NEW Style.fasterAnimationDuration
BREAKING Removed DropdownButton and Button.dropdown
InfoHeaderComboBox (Follows this)TappableListTileDropdownButton and Button.dropdown- NEW Vertical Slider
NEW Indeterminate ProgressRing (@raitonoberu)
ProgressRing (@raitonoberu)ListTileDiagnostics support to:
StyleNavigationPanelStyleTooltipStyleThis version provides the fix for #5
This version provides the fix for #5
Theme.of can't be null anymore. Use Theme.maybeOf for suchStyle.inactiveBackgroundColorcolor, border, borderRadius from IconButtonStyle to decorationDiagnostics support to the following classes:
NEW Determinate ProgressBar and ProgressRing
ProgressBar and ProgressRingTabView (#TabView)- FIX Fixed InfoBar's overflow
InfoBar's overflowBREAKING RadioButton's selected property was renamed to checked to match a single pattern between all the other widgets.
RadioButton's selected property was renamed to checked to match a single pattern between all the other widgets.NEW | EXAMPLE APP Settings screen
Settings screenFluentApp doesn't lose its state anymore, possibiliting hot relaod.showDialog rework:
showDialog now can return data. (Fixes #2)showDialog.transitionBuildershowDialog.useRootNavigatorshowDialog.routeSettingsBREAKING Removed _regular from the name of the icons.
_regular from the name of the icons.InfoBar (Follows this)- NEW Divider
DividerFIDELITY Improved ToggleButton fidelity
ToggleButton fidelityNavigationPanelBodyEntrancePageTransition (#PageRefresh)DrillInPageTransition (#Drill)HorizontalSlidePageTransition (#HorizontalSlide)SuppressPageTransition (#Supress)Style.fastAnimationDuration (Defaults to 150ms)Style.mediumAnimationDuration (Defaults to 300ms)Style.slowAnimationDuration (Defaults to 500ms)animationCurve is now Curves.easeInOut (standard) instead of Curves.linearStyle.animationDurationBREAKING Removed Card widget. Use Acrylic instead
Migrated all the widgets to use typography
Your coding agent can read these notes before it upgrades. Set up the MCP server →