NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #2035 most downloaded on pub.dev
Implements Microsoft's Windows User Interface in Flutter.
Last release 2 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.
Menu bar rework by @bdlukaa in #1337
AutoSuggestBox.popupDirection by @bdlukaa in #1345Full Changelog: v4.16.0...v4.16.1
ComboBox no longer throws when opening a dropdown with a single item (#1347)TabView now keeps each tab's body (and its state) attached to its tab when tabs are reordered, instead of leaving a stateful body parked at its old slot while the header movesMenuBar.overflowBehavior (#1337)
MenuBar now uses RawMenuBar under the hood.Tooltip.enableTapToDismiss and Tooltip.onTriggered (#1338)
Tooltip now uses RawTooltip under the hood.TitleBar now doesn't listen for onDoubleTap if the caller doesn't provide a callback. Listening for onDoubleTap causes a 300ms delay on single taps (#1340)NumberBox fix focus (using tab) when clearButton is true (#1341)ComboBox now expands vertically for larger text scaling, preventing clipped text (#1342)AutoSuggestBox.popupDirection (#1345)refactor: Flutter 3.44.0 support
MenuBar now doesn't throw "Duplicated Global Key" and/or Rendering exceptions when hovering on different MenuBarItem(s) with the flyout open (#1334)Tooltip now correctly uses constructor-given style ((#1321)[https://github.com//pull/1321])ButtonStyle.textStyle to Buttons content (#1318)TitleBar now accounts for view padding (05c122b)FluentTextSelectionToolbar no longer ignores custom ContextMenuButtonItems (#1317)NumberBox remove ghost focus and do not focus inline buttons anymore (#1332)Tooltip now correctly uses constructor-given style by @jacksonb-cs in #1321Full Changelog: v4.15.0...v4.16.0
fix: NavigationView auto display mode no longer shows a brief overlay when resizing from minimal to compact mode
NavigationView auto display mode no longer shows a brief overlay when resizing from minimal to compact mode (#1316)MenuFlyout sub-item tree now correctly expands to the left and shows a chevron_left icon when right-to-left directionality is enabled (#1342)NavigationView compact pane PaneItemExpander flyout is now correctly placed in right-to-left directionality; Flyout leftTop and rightTop placement modes now correctly align with the top of the target element when the flyout is taller than the available space above the target (#1289)Tab in TabView is now draggable from its entire area, including the padding (#1356)fix: MenuFlyout no longer throws TypeError on sub-items
MenuFlyout no longer throws TypeError on sub-items (#1337)VisualDensity from FluentThemeData for compact sizing. Use FluentThemeData(visualDensity: VisualDensity.compact) to enable compact mode (#1175)NavigationView no longer throws BoxConstraints has a negative minimum height when header and menu button are both absent (#1334)ProgressBar chooses the correct direction when directionality is right-to-left (#1291)DatePicker, TimePicker, AutoSuggestBox, CalendarDatePicker popups (#1321, #1286)RatingBar to RatingControl, and updated its style (#1274)NumberBox compact overlay is now positioned correctly on right-to-left directionality (#1326)TreeViewController for programmatic control of TreeView (#1140)
TreeViewController provides methods: getItemFromValue(), addItem(), addItems(), removeItem(), moveItem(), expandItem(), collapseItem(), expandAll(), collapseAll(), selectItem(), deselectItem(), selectAll(), deselectAll()controller.moveItem(item, newParent: target, index: 0)TreeViewItem.children is now unmodifiable. Use TreeViewController methods (addItem(), addItems(), removeItem(), moveItem()) to modify tree structure.TitleBar now supports double-click callback to maximize or restore the window (#1298)TitleBar's isBackButtonEnabled (#1298)Full Changelog: v4.14.0...v4.15.0
BREAKING CHANGE refactor: Remove BottomNavigationBar and all its related widgets
refactor: Consistent theme classes
fix: CalendarDatePicker throws state error when selecting date (#1251)
feat: Named constructors for InfoBar (#1247)
InfoBar.info(title: Text(error));
InfoBar.warning(title: Text(error));
InfoBar.success(title: Text(error));
InfoBar.error(title: Text(error));
refactor: Expose TooltipState
fix: NumberBox calls onChanged() when clicked on (#1196)
feat: Add NumberBox.parser, which allows to use a custom parse function for the number box. (#1166)
feat: Support long pressing on NumberBox increment and decrement buttons. Added NumberBox.interval (#1267, #843, #1285)
fix: Correctly lerp between theme properties (#953)
fix: Correctly apply theme durations to animations (#1231)
feat: Apply text height on Typography
refactor: Encourage usage of EdgeInsetsDirectional instead of EdgeInsets
BREAKING CHANGE refactor: Remove BottomNavigationBar and all its related widgets
MINOR BREAKING refactor: Remove Brightness.isLight, Brightness.isDark and Brightness.opposite extension methods. Use switch statements instead.
Before:
final theme = FluentTheme.of(context);
final color = theme.brightness.isDark ? Colors.white : Colors.black;
After:
final theme = FluentTheme.of(context);
final color = switch (theme.brightness) {
Brightness.light => Colors.black,
Brightness.dark => Colors.white,
};
feat: Add latest color resources from Microsoft UI XAML.
refactor(perf): Optimize animation handling in Scrollbar, NavigationView, Acrylic and buttons.
refactor(perf): Reduce calls to setState and frames scheduling in several widgets.
BREAKING CHANGE NavigationView reworked to be more flexible and match the Windows UI 3 specs.
PaneDisplayMode.open to PaneDisplayMode.expanded.appBar to titleBar.NavigationAppBar class. Any widget can now be a title bar.TitleBar widget, which matches the design and functionality of a Window title bar.PaneBackButton widget, a button that allows the user to pop the current route.PaneToggleButton widget, a button that opens or close the navigation view pane. (#1051)NavigationPane.toggleButtonPosition, which sets the preferred position of the toggle button. (#669)PaneItems are now lazy-loaded, improving overall performance (#742)StickyNavigationIndicator animation to match Win UI 3 specs (#540)PaneItemExpander now supports deep nesting (#1019)PaneItemExpander no longer resets itself when the tree is updated. (#876)PaneItemExpander doesn't require a body anymore. If no body is provided, the item will not be selectable. (#1189)NavigationView important data using NavigationView.dataOf(context)NavigationPane.acrylicDisabled, which allows disabling acrylic material effect of the pane overlaysInfoBadge style variants (success, attention, critical), dot badges and adaptive sizing (#1277)NavigationView holds a local history. Use NavigationView.of(context).pop() or PaneBackButton to navigate to the previous index (#1266)chore: Updated Russian translations (#1253)
Update Chinese translations (#1283)
BREAKING CHANGE RadioButton API reworked to use RadioGroup for state management.
checked and onChanged parameters from RadioButton.value parameter to RadioButton<T>.RadioGroup<T>, which holds groupValue and onChanged.Before:
RadioButton(
checked: selectedIndex == 0,
onChanged: (value) { if (value) setState(() => selectedIndex = 0); },
content: Text('Option 1'),
)
After:
RadioGroup<int>(
groupValue: selectedIndex,
onChanged: (value) { if (value != null) setState(() => selectedIndex = value); },
child: Column(
children: [
RadioButton<int>(value: 0, content: Text('Option 1')),
RadioButton<int>(value: 1, content: Text('Option 2')),
],
),
)
fix: Flyout barrier color (#1276)
fix: NavigationView transition when in top
fix: NavigationView transition when in top (#1220)
feat: Added CalendarView widget (#1232 thanks to @asmitta-01, #236)
feat: Added CalendarDatePicker (#236)
feat: Added WindowsIcon and WindowsIcons (#1237)
fix: Slider label on drag (#1248)
fix: closeAfterClick at the item level is no longer ignored on DropDownButton (#1245)
MINOR BREAKING feat: FlyoutController.close can now return a value to the previous route. (#1246)
Before:
// normally close the flyout
flyoutController.close();
// forcefully close the flyout
flyoutController.close(true);
After:
// normally close the flyout
final result = flyoutController.close<String>('my result');
// forcefully close the flyout
flyoutController.forceClose();
fix: Check if AutoSuggestBox is mounted before dismissing overlay (#1228)
feat: Added TextBox.onTapUpOutside, TextBox.forceLine, TextBox.mouseCursor, TextBox.onAppPrivateCommand, TextBox.onSelectionHandleTapped, TextBox.scro
TextBox.onTapUpOutside, TextBox.forceLine, TextBox.mouseCursor, TextBox.onAppPrivateCommand, TextBox.onSelectionHandleTapped, TextBox.scrollBehavior, TextBox.textScaler, TextBox.textHeightBehavior, TextBox.textWidthBasis.TextBox.clearButtonMode (#1225)FlyoutController being used after disposed (#1224)fix: Add missing translations for French
feat: Added Tagalog localization support
feat: Added Tagalog localization support (#1207)
feat: Added ListTile.decorationMargin parameter
fix: Custom ContextMenuButtonItem are correctly displayed on text selection control (#1212)
fix: TreeView's focus always starts at first or last item (#834, #1195)
fix: InfoBar no longer throw error when automatically closing (#955, #1215)
fix: Properly disable date and time pickers when onChanged is null (#1210)
fix: MenuFlyoutSubItem no longer errors while building when FlyoutPlacementMode.auto is used (#1206, #1191)
fix: The checkbox inside ListTile.selectable should not have its own focus (#1144)
feat: BaseButton.onTapUp reflects the GestureDetector.onTapUp (#1201)
feat: Add BreadcrumbBar.chevronAlignment (#1213)
MINOR BREAKING feat: Tab.backgroundColor, Tab.selectedBackgroundColor, Tab.foregroundColor, Tab.selectedForegroundColor and Tab.outlineColor are now instance of WidgetStateProperty<Color>. (#1214)
Before:
Tab(
backgroundColor: FluentTheme.of(context).inactiveColor,
selectedBackgroundColor: Colors.blue,
foregroundColor: Colors.white,
selectedForegroundColor: Colors.black,
outlineColor: Colors.grey,
),
After:
Tab(
backgroundColor: WidgetStateProperty.resolveWith((_) {
return FluentTheme.of(context).inactiveColor;
}),
selectedBackgroundColor: WidgetStateProperty.all(Colors.blue),
foregroundColor: WidgetStateProperty.all(Colors.white),
selectedForegroundColor: WidgetStateProperty.all(Colors.black),
outlineColor: WidgetStateProperty.all(Colors.grey),
),
This allows the Tab to be customized based on its state, such as hovered, pressed, focused, and disabled, and to be affected by theme changes.
fix: TabView.newTabIcon is now typed as a Widget
TabView.newTabIcon is now typed as a Widget (#1187)Expanded.enabled (#1188)TextBox.unfocusedColor on unfocused highlight border (#1192)TimePicker (#1198)TimePicker and DatePicker popups (#1200)enabled to PaneItemAction (#1202)fix: Use correct scaffold background color when view is provided
fix: Do not show selected indicator on menu flyout items.
…and rightBottom. left and right are now deprecated and default to leftCenter and rightCenter, respectively. Additionally, added the full placement mod…
fix: hide Tab's close button when onClosed is null
feat: Add TextBox.cursorOpacityAnimates (defaults to FluentThemeData.cursorOpacityAnimates, which defaults to false); default setting improves CPU/GPU efficiency while TextBox has focus (#1164)
fix: DatePicker selectable range matches the one between startDate and endDate (#1170)
fix: ScaffoldPage has a built-in color if no parent NavigationView is found (#1168)
feat: Added FlyoutController.showFlyout.buildTarget (#1173)
Primary items of the command bar are now accessible through the secondary flyout.
feat: Added these options to FlyoutController (#1178)
horizontalOffset, which manipulates how the flyout will be positioned horizontally;reverseTransitionDuration, which sets the duration of the reverse transition;transitionCurve, which sets the curve of the transition;feat: Added FlyoutController.close (#1174)
fix: Use the correct placement mode in transition when automatic mode is selected (#1178)
feat: FlyoutContent and MenuFlyout now match their native counterparts (#1178)
fix: Jitter when displaying flyouts and sub flyouts (#1014)
fix: Menu sub items have the same transition as their parents (#1178)
chore: SubItemShowBehavior was renamed to SubItemShowAction (#1178)
feat: Flyouts are closed when the window size changes (#1178)
feat: Added CommandBarButton.closeAfterClick (#1149)
fix: CommandBar secondary menu preferred placement mode (#1174)
feat: CommandBarState is now accessible, making it possible to open/close the secondary flyout programmatically (#1174)
final commandBarKey = GlobalKey<CommandBarState>();
CommandBar(
key: commandBarKey,
...,
),
commandBarKey.currentState?.toggleSecondaryMenu();
commandBarKey.currentState?.secondaryFlyoutController.close();
fix: TextBox alignment no longer depend on decoration (#1027)
feat: Added TextBox.undoController and implemented "Undo" action in toolbar options (#1175)
feat: Handle TextBox context menu controls on mobile platforms (#1022)
fix: Default TextBox border
feat: Added Nepali localization support (#1177)
feat: Teaching Tips (#412)
feat: Added more flyout placement modes: leftTop, leftCenter, leftBottom, rightTop, rightCenter and rightBottom. left and right are now deprecated and default to leftCenter and rightCenter, respectively. Additionally, added the full placement mode, which allows the flyout to position itself within the screen. (#570)
fix: Add missing properties ( closeIconSize , closeButtonStyle ) in debugFillProperties and InfoBarThemeData.merge ( #1128
fix: Add missing properties (closeIconSize, closeButtonStyle) in debugFillProperties and InfoBarThemeData.merge (#1128
feat: Add TabView.reservedStripWidth, which adds a minimum empty area between the tabs and the tab view footer (#1106)]
fix: Correctly unfocus NumberBox when user taps outside (#1135)
fix: Do try to scroll Date and Time at build time (#1117)
feat: Use a Decoration instead of Color in NavigationAppBar (#1118)
feat: Add EditableComboBox.inputFormatters (#1041)
BREAKING feat: TextBox.decoration and TextBox.foregroundDecoration are now of type WidgetStateProperty (#987)
Before:
TextBox(
decoration: BoxDecoration(
color: Colors.red,
),
foregroundDecoration: BoxDecoration(
color: Colors.blue,
),
),After:
TextBox(
decoration: WidgetStateProperty.all(BoxDecoration(
color: Colors.red,
)),
foregroundDecoration: WidgetStateProperty.all(BoxDecoration(
color: Colors.blue,
)),
),feat: Add TabView.gestures, which allows the manipulation of the tab gestures (#1138)
feat: Add DropDownButton.style (#1139)
feat: Possibility to open date and time pickers programatically (#1142)
fix: TimePicker hour offset
feat: Add ColorPicker (#1152)
fix: NumberBox initial value formatting (#1153)
fix: NumberBox incrementing/decrementing when not focused (#1124)
fix: NumberBox text is correctly when there are no visible actions (#1150)
Full Changelog: v4.9.2...v4.10.0
feat: NavigationAppBar.leading now has a minimum width of kCompactNavigationPaneWidth instead of being fixed to this width
NavigationAppBar.leading now has a minimum width of kCompactNavigationPaneWidth instead of being fixed to this width (#1103)TabView.stripBuilder (#1106)EditableComboBox.style (#1121)BreadcrumbBar.chevronIconBuilder and BreadcrumbBar.chevronIconSize (#1111)DropDownButton items if onPressed is not provided (#1116)ToggleMenuFlyoutItem and RadioMenuFlyoutItem (#1108)Full Changelog: v4.9.1...v4.9.2
feat: ¹ NumberBox now supports precision greater than 4. ² Add NumberBox.pattern , NumberBox.formatter , NumberBox.format
NumberBox now supports precision greater than 4. ² Add NumberBox.pattern, NumberBox.formatter, NumberBox.format (#1080)PaneItem within PaneItemExpander remained accessible in NavigationPane compact mode (#1081)DatePicker popup (#1049)PaneItemWidgetAdapter (#1087)maxWidth to TooltipThemeData for optional wrapping of long tooltips (#1094)PaneItem Behavior in Compact Mode by @WXL-steven in #1082Full Changelog: v4.9.0...v4.9.1
feat: Deprecate TabView.addIconData and TabView.addIconBuilder . Use TabView.newTabIcon instead.
fix: ¹ DropDownButton.closeAfterClick is now correctly applied. ² Added MenuFlyoutItem.closeAfterClick, which defaults to true. (#1016)
fix: MenuFlyoutSubItem does not close when pressed (#1037)
fix: Make ScaffoldPage opaque (#1048)
fix: Scroll issue in DatePicker. (#1054)
feat: Add NumberBox.textInputAction and NumberBox.onEditingComplete (#1063)
fix: NumberBox does not calls a rebuild when it is already building (#1064)
feat: Add Tab.color, Tab.selectedColor and Tab.outlineColor to TabView (#1068)
feat: Added NavigationView.onItemPressed callback, called when the item is on tap (#1067)
fix: Mark MenuFlyoutItem as disabled when .onPressed is null (#1074)
BREAKING feat: Removed ButtonState, ButtonStates and their related classes. Use WidgetStateProperty, WidgetState instead. (#1075)
Before:
Button(
style: ButtonStyle(
shape: ButtonState.all(RoundedRectangleBorder(...)),
backgroundColor: ButtonState.resolveWith((states) {
if (states.isPressed) {
return Colors.blue.shade900;
}
return Colors.blue;
}),
foregroundColor: ButtonState.resolveWith((states) {
return ButtonState.forStates<Color>(
states,
disabled: Colors.grey,
hovered: Colors.white.withOpacity(0.8),
pressed: Colors.white.withOpacity(0.6),
);
}),
),
),After:
Button(
style: ButtonStyle(
shape: WidgetStatePropertyAll(RoundedRectangleBorder(...)),
backgroundColor: WidgetStateProperty.resolveWith((states) {
if (states.isPressed) {
return Colors.blue.shade900;
}
return Colors.blue;
}),
foregroundColor: WidgetStateProperty.resolveWith((states) {
return WidgetStateExtension.forStates<Color>(
states,
disabled: Colors.grey,
hovered: Colors.white.withOpacity(0.8),
pressed: Colors.white.withOpacity(0.6),
);
}),
),
),fix: Do not dismiss Scrollbar if it is still being pressed (#1077)
feat: Make Tab a widget that can be overridable (#1050)
To create a custom Tab, you can now extend Tab:
class MyCustomTab extends Tab {
MyCustomTab({super.key, required super.text, required super.body});
@override
State<Tab> createState() => MyCustomTabState();
}
class MyCustomTabState extends TabState {
@override
Widget build(BuildContext context) {
super.build(context);
return ColoredBox(
color: Colors.red,
child: super.build(context),
);
}
}Explore the TabState reference to see all the available methods you can override.
feat: Deprecate TabView.addIconData and TabView.addIconBuilder. Use TabView.newTabIcon instead.
fix: TabView.closeDelayDuration default value is now 1 second.
Full Changelog: v4.8.0...v4.9.0
fix: A child of Button has an unbound height constraint.
fix: Pop the menu flyout before than calling the close callback
Button.child is now vertically centered (#1011)Button's foreground color when hovered and pressed (#1012).textController and .onTextChanged to EditableComboBox. (#1017)MINOR BREAKING Renamed NavigationPaneThemeData.standard to NavigationPaneThemeData.fromResources, and removed the backgroundColor and inactiveColor pr
feat: Added Croatian localization support
fix: Offer a more clear exception info in PaneItemExpander
fix: The MenuFlyoutSubItem in the DropDownButton was not displaying when hovered or pressed.
feat: Added NavigationPane.toggleable
Correctly paint buttons borders
Correctly paint buttons borders (#956)
MINOR BREAKING Removed ButtonStyle.border. Use ButtonStyle.shape instead:
Before:
Button(
style: ButtonStyle(
border: ButtonState.all(BorderSide(...)),
),
),Now:
Button(
style: ButtonStyle(
shape: ButtonState.all(RoundedRectangleBorder(...)),
),
),BREAKING Removed Chip and its related widgets.
BREAKING Removed PillButtonBar and its related widgets. Use CommandBar instead.
BREAKING Removed SplitButtonBar. Use SplitButton instead.
BREAKING Removed BottomSheet and its related widgets and functions.
BREAKING Removed Snackbar, showSnackbar and their related widgets. Use InfoBar and displayInfoBar instead.
fix: do not close InfoBar twice (#955)
feat: add Kurdish locale (#962)
fix: review debugFillProperties on widgets (#974)
fix: Date and Time pickers when localization is not English (#961)
Full Changelog: v4.7.7...v4.8.0
fix: ProgressRing and ProgressBar now fit correctly the parent bounds
ProgressRing and ProgressBar now fit correctly the parent bounds (#942)TabView buttons was only rendered on hover. Now the buttons (add and scroll buttons) are always rendered.ComboboxItem correctly apply foreground color. Added ComboboxItem.enabled (#949)scroll_pos dependecy to the latest version which is 0.5.0Full Changelog: v4.7.6...v4.7.7
fix: items not aligned centered in ListTile. Added ListTile.contentAlignment and ListTile.contentPadding
fix: do not enforce a tree view item on TreeView
TreeView (#934)fix: tap on DatePicker day does not skip a day
DatePicker day does not skip a day (#914)PaneItemExpander's flyout is attached before using it (#857)TextField properties on NumberBox (#933)TextField properties on PasswordBox (#925)AutoSuggestBox.onOverlayVisibilityChanged now results in the correct state (#926)MenuFlyoutSubItem inherits the acrylic data from MenuFlyout (#932)MenuFlyoutSubItem inhertis its MenuFlyout parent decoration data (#931)paneNavigationButtonIcon on NavigationPaneThemeData (#929)feat: Expose AutoSuggestBoxState (#912) With it, you can now control the AutoSuggestBox state, such as opening and closing the overlay. Use the .dismi
feat: Expose AutoSuggestBoxState (#912)
With it, you can now control the AutoSuggestBox state, such as opening and closing the overlay. Use the .dismissOverlay method to close the overlay and .showOverlay to display it.
Use the AutoSuggestBox.onOverlayVisibilityChanged callback to listen to overlay visibility changes.
fix: StickyNavigationIndicator now doesn't stop if another item interrupts the ongoing animation (36b82b)
fix: Render Combobox's elevation outside of the clipper (#896)
fix: Do not make items exclusive on NavigationView's body (#913)
fix: Expander.content has now its focus excluded when closed
fix: Fixed compile errors with Flutter 3.13.0 stable (#915)
feat: Add Wifi and Bluetooth icons
ListTile.cursor (#901)Tab.disabled (#904)NavigationPaneThemeData.overlayBackgroundColor, which is displayed on overlays, such as minimal and compact pane overlays (#903)PaneItem.infoBadge and PaneItem.trailing while the pane is transitioning (#906)NavigationView.onOpenSearch is called when autoSuggestBoxReplacement is pressed (c251600)AutoSuggestBox overlay is now only displayed after the user started typing (d95970a)Deprecated SplitButtonBar and its related widgets. Use SplitButton or SplitButton.toggle instead (#882, #411)
CommandBar. (#872)SplitButtonBar and its related widgets. Use SplitButton or SplitButton.toggle instead (#882, #411)BreadcrumbBar (#878)Expander header is sized dynamically (#523)Expander.contentPadding and Expander.contentShape (#891)FluentThemeData.selectionColor, which defaults to the accent color normal shade (#897)NavigationAppBar.title is expanded to fit the entire width on top mode (#902)AutoSuggestBox does not duplicate focus (#894)StickyNavigationIndicator look-and-feel updated to match the native implementation (#380b49c)Deprecated all mobile widgets: BottomSheet, Snackbar, Chip and PillButtonBar - and all their related widgets.
AutoSuggestBox.itemBuilder callback builder, which builds the items inside the overlay (#869)AutoSuggestBoxItem.semanticsLabel (#869)ButtonState.forStates, a helper function to quickly resolve values for each button state (#875).disabledColor, uncheckedColor, .checkedColor and .borderInputColor from FluentThemeData. Use the values from theme resources instead (1295b6)ToggleSwitch.thumb and .thumbBuilder have been renamed to .knob and .knobBuilder, respectively. DefaultToggleSwitchThumb was renamed to DefaultToggleSwitchKnob (e15e89d)CheckboxThemeData.foregroundColor, RadioButtonThemeData.foregroundColor and ToggleSwitchThemeData.foregroundColor, which, by default, reacts if the inputs are disabled or not (#861)ToggleSwitch correctly behaves as disabled when onChanged is null (4b5afb5)PaneItemExpander.initiallyExpanded (#864)NumberFormBox (#862)PaneItem.onTap from PaneItemExpander.items, when displayed in popup, are now correctly invoked (#859)Combobox items on web now works properly (#757)TreeViewItem, if selection mode is single, gets selected when focused with the keyboard (#835)TreeView's built-in checkbox now doesn't receive focus. It can now be focused by invoking it with the keyboard (#877)DatePicker and TimePicker (#6)DatePicker.endDate.year is taken into account when displaying the years (#874)DatePicker's day field is now correctly selected (d152dc)DatePicker and TimePicker are correctly fit into the navigator bounds (711390)TreeView.gesturesBuilder and TreeViewItem.gestures (#851)Semantics. Now, not every input is treated as a button (2fee45)BottomSheet, Snackbar, Chip and PillButtonBar - and all their related widgets. (c1cfe491)EditableComboboxFormField.value. Use EditableComboboxFormField.initialValue insteadDatePicker.startYear. Use DatePicker.startDate insteadDatePicker.endYear. Use DatePicker.endDate insteadTextButton. Use HyperlinkButton insteadTabView.wheelScroll. It is no longer usedThemeData. Use FluentThemeData instead- Fix Urdu localization
Fix incompatibilities with Flutter 3.10
BREAKING Removed FluentApp.useInheritedMediaQuery
DateTime.startYear and DateTime.endYear are now deprecated. Use DateTime.startDate and DateTime.endDate instead.
HyperlinkButton now uses the correct color in dark mode (#817)DatePicker, TimePicker and all other overlay widgets are now positioned correctly if there are multiple navigators (#817)PasswordFormBox (#811)DateTime.startYear and DateTime.endYear are now deprecated. Use DateTime.startDate and DateTime.endDate instead. (#687).decoration, .foregroundDecoration, .highlightColor, .unfocusedColor, .keyboardAppearance, .textAlign, .textAlignVertical to PasswordBox (#820)NavigationView now works correctly in top mode (#821)showDialog.dismissWithEsc (#826)BREAKING CHANGE TextButton is renamed to HyperlinkButton and ButtonThemeData.textButtonStyle is renamed to ButtonThemeData.hyperlinkButtonStyle
backButtonDispatcher when using FluentApp.router (#803)onTapDown and onTapUp on all buttons. (#795)
BaseButton, these two parameters are now requiredPasswordBox widget (#795)TextButton is renamed to HyperlinkButton and ButtonThemeData.textButtonStyle is renamed to ButtonThemeData.hyperlinkButtonStyle (#802).notificationPredicate, .scrollbarOrientation, .pressDuration and .minOverscrollLength to Scrollbar (#809)TreeView elements on item invocation (#810)Add NumberBox widget. (#560 #771 #789)
Add support for routerConfig to FluentApp.router (#781)
Add source code for Show InfoBar in example application. (#785)
Make color optional in FluentApp.router. (#782)
Fix TabView scroll (the item count was not correctly set) and now the scroll event is not propagated to the parent. (#772)
Do not calculate the position of the flyout if the position parameter is provided. (#764)
Add source code for Surfaces/CommandBar in example application (#766)
Do not enforce a max height on PaneItem (#762)
Add Greek localization (#761)
Add NavigationState.compactOverlayOpen (#758):
final key = GlobalKey<NavigationState>();
NavigationView(key: key);
final isCompactModeOpen = key.currentState?.compactOverlayOpen ?? false;
TabView lazy loading (#751)
Added Bangla localization (#786)
Correctly position the flyouts and tooltips on a multi navigator context (#780)
Allow all kinds of menu flyout widgets on DropDownButton (#775)
Added CommandBarCard.borderColor
Dynamically adding/removing items in NavigationPane
Dynamically adding/removing items in NavigationPane (#744)
Fix example application was showing window icons twice on transparency change and maximizing
Add TextFormBox.initialValue (#749)
Add PaneItem.enabled (#748)
Add Thai localization (#750)
FocusTraversalGroup is no longer added above paneBodyBuilder (#700)
BREAKING NavigationView.paneBodyBuilder now takes two arguments (#700)
Before:
NavigationView(
paneBodyBuilder: (child) {
return child;
}
),
Now:
NavigationView(
paneBodyBuilder: (item, child) {
return child;
}
)
Use correct height and padding on TextBox (#754)
Updated TextBox cursor to match the native implementation (#754)
TextBox state is now updated correctly when focused (#754)
TabView focus on children now works properly
TabView macos shortcuts (#728)TabView focus on children now works properly (#648)TabView colors now follow the Win UI 3 theme resources (#730)ContentDialog copy code (#735)TextBox rework:
.initialValue. Use TextEditingController.text instead.header and .headerStyle. Use InfoLabel instead.outsidePrefix, .outsidePrefixMode, .outsideSuffix, .outsideSuffixMode.minHeight and .iconButtonThemeDataAutoSuggestBox popup is now part of the text box tap region (#698)FluentTextSelectionToolbar now follows global typography (#712)BREAKING Removed deprecated memebers: DropDownButtonItem and DropDownButton.buttonStyle
Correctly calculate the padding around the flyout on automatic mode
Possibility to supply transparent colors to the barrier (#702)
Correctly assign the current pane mode to PaneItemExpander (#707)
showFlyout.dismissOnPointerMoveAway now takes the whole flyout box into consideration
MINOR BREAKING Replaced ContentManager and ContentSizeInfo with Flyout
Before:
final size = ContentSizeInfo.of(context).size;
Now:
final size = Flyout.of(context).size;
With it, it's also possible to have multiple info about the current open flyout. Sub-menus also have their own flyout instance. To close the current flyout, use Flyout.of(context).close();
Added option to open DropDownButton flyout programatically (#723)
final dropdownKey = GlobalKey<DropDownButtonState>();
DropDownButton(
key: dropdownKey,
...
);
dropdownKey.currentState?.open(...); // opens the flyout
final isOpen = dropdownKey.currentState?.isOpen ?? false; // checks if the flyout is open
BREAKING Removed deprecated memebers: DropDownButtonItem and DropDownButton.buttonStyle (#724)
ThemeData is depreacted. Use FluentThemeData instead (#722)
BREAKING MenuFlyoutSubItem.items now requires a function
Before:
MenuFlyoutSubItem(
items: [...]
),
After:
MenuFlyoutSubItem(
items: (context) {
// You can call Flyout.of(context).close(), for example
return [...]
},
)
Flyouts were reworked to match the design and behavior of native WinUI 3
Flyouts rework (#690):
Flyouts were reworked to match the design and behavior of native WinUI 3
BREAKING Removed Flyout widget.
To replace it, FlyoutTarget and FlyoutController were created. FlyoutTarget works like a target, which the given controller will use to display the flyout
Migration guide:
Before:
final controller = FlyoutController();
Flyout(
controller: controller,
placement: ...,
position: ...,
verticalOffset: ...,
onOpen: ...,
onClose: ...,
child: Button(
onPressed: controller,
child: Text('Tap me'),
),
),
Now:
final controller = FlyoutController();
FlyoutTarget(
controller: controller,
child: Button(
onPressed: _showFlyout,
child: Text('Tap me'),
),
),
void _showFlyout() async {
await controller.showFlyout(
barrierDismissible: ...,
dismissWithEsc: ..., // NEW
dismissOnPointerMoveAway: ..., // NEW
placementMode: ...,
autoModeConfiguration: ..., // NEW
forceAvailableSpace: ..., // NEW
shouldConstrainToRootBounds: ..., // NEW
additionalOffset: ...,
margin: ..., // NEW
barrierColor: ...,
navigatorKey: ..., // NEW
transitionBuilder: ..., // NEW
transitionDuration: ..., // NEW
builder: (context) => FlyoutContent(...),
);
}
Now, it's possible to dismiss the flyout by tapping the barrier (barrierDismissible), pressing the ESC keyboard key (dismissWithEsc) and by moving the cursor (pointer) away from the flyout (dismissOnPointerMoveAway - defaults to false);
Automatic mode is finally implemented, and it's the default mode. By setting autoModeConfiguration, it's possible to customize the preferred flyout placement. If flyout doesn't meet the placement conditions, it decides where it fits the best.
forceAvailableSpace determines whether the flyout size should be forced the available space according to the attached target. It's useful when the flyout is large but can not be on top of the target. NavigationView's top navigation mode now uses it by default on pane items overflow.
shouldConstrainToRootBounds determines whether the flyout should fit the root bounds - usually the window bounds. If false, the flyout will be able to overflow the screen on all sides. Defaults to true
margin determines the margin of the flyout to the root. additionalOffset determines the margin of the flyout to the target.
It's now possible to assign a custom transition to the flyout by providing transitionBuilder and transitionDuration. By default, a light slide-fade transition is used, but it can be highly customizable to fit your needs. It provides the current placement mode - since automatic mode may change it at layout time. DropdownButton uses it to create its slidethrough transition.
position and placement were replaced by placementMode, which gives horizontal and vertical options of placement, at all screen alignments. It's also possible to use it in a right-to-left context by using placementMode.resolve(Directionality.of(context))
Use position to display the flyout anywhere in the screen. It's useful to create context menus
Added support for Flutter 3.7 (#568)
Added TextBox.magnifierConfiguration, TextBox.spellCheckConfiguration and TextBox.onTapOutside
Add AutoSuggestBox.maxPopupHeight
AutoSuggestBox.maxPopupHeight (#677)NavigationViewState if no pane was currently selected (#678)NavigationView.paneBodyBuilder responsible for state management of the widget it returns, allowing paneBodyBuilder to return an IndexedStack (common use case) (#679)minute, hour, day, month, and yearAvoid overflow in DatePicker and TimePicker popup
DatePicker and TimePicker popup (#663)AutoSuggestBox items by long pressing arrow up and down keysAutoSuggestBox (#671)AutoSuggestBox's trailingIcon now comes after the close buttonTextBox.clearGlobalKey was removed, since it was not usedAutoSuggestBox.unfocusedColor and TextFormBox.unfocusedColordisplayInfoBar, which shows an info bar as an overlay (#673)ThemeData.extensions (#674)FlyoutListTile can be used outside of a flyout
PageHeader now gives appropriate bounds to its commandBar
Ensure acrylic is updated only if it's mounted
startYear and endYear in DateTime are used properly (#627)TreeViewItem (#632)NavigationPane.scrollBehavior (#640)CommandBarCard.borderRadius (#641)TextFormBox.initialValueTreeViewState.toggleItem, which toggles the item expanded state (#493)NavigationView pane items are brought into view when selectedFixed TreeView selection state behavior for items that are not expanded
TreeView selection state behavior for items that are not expanded (#578)NavigationView is properly preserved (#607)ExpanderState.open to ExpanderState.isExpandedExpander (#596)ToggleButton border width is uniform (#610)- Update documentation
NavigationView scrollbar can now be dragged
Add NavigationView.paneBodyBuilder for customization of widget built for body of pane.
NavigationView.paneBodyBuilder for customization of widget built for body of pane. (#548)NavigationAppBar unnecessary leading icon when no pane is provided in NavigationView (#551)NavigationView.minimalPaneOpen and, with it, the possibility to open minimal pane programatically (#564)NavigationView compact mode transitionTreeView updates (#555):
TreeViewItemInvokeReason parameter to TreeView.onItemInvoked and TreeViewItem.onInvoked.TreeView.includePartiallySelectedItems so that items who have children with a mixed selection state will be included in the onSelectionChanged callback.TreeView.deselectParentWhenChildrenDeselected optional behavior so that parent items can remain selected when all of their children are deselected.TreeViewItem.setSelectionStateForMultiSelectionMode helper method and [TreeViewItem].selectedItems extension method, to make it easier for application code to programmatically change selection state of items in a multi-selection mode tree view.PaneItemAction.body is no longer required
PaneItemAction.body is no longer required (#545)DropDownButton.onOpen and DropDownButton.onClose callbacks (#537)MenuFlyoutItem.onPressed is called after the flyout is closed if DropDownButton.closeAfterClick is true (#520)TimePicker and DatePicker popups will fit if the screen is small (#544)NavigationAppBar.leading (#539)AutoSuggestBox.noResultsFoundBuilder (#542)AutoSuggestBox.inputFormatters (#542)BREAKING Removed NavigationBody. Use PaneItem.body instead (#510/#531): Before:
BREAKING Removed NavigationBody. Use PaneItem.body instead (#510/#531):
Before:
NavigationView(
pane: NavigationPane(
items: [
PaneItem(icon: WindowsIcon(WindowsIcons.add)),
PaneItem(icon: WindowsIcon(WindowsIcons.add)),
PaneItem(icon: WindowsIcon(WindowsIcons.add)),
],
),
content: NavigationBody(
children: [
_Item1(),
_Item2(),
_Item3(),
],
),
),
Now:
NavigationView(
...
pane: NavigationPane(
items: [
PaneItem(
icon: WindowsIcon(WindowsIcons.add),
body: _Item1(),
),
PaneItem(
icon: WindowsIcon(WindowsIcons.add),
body: _Item2(),
),
PaneItem(
icon: WindowsIcon(WindowsIcons.add),
body: _Item3(),
),
],
),
),
Or if you don't have a pane, you can use the content like the following:
NavigationView(
content: ScaffoldPage(
header: PageHeader(
title: titleRow,
),
content: child,
),
),
either one attribute of pane or content must not be null
Use NavigationView.transitionsBuilder to create custom transitions
Added PaneItem.onTap (#533)
Compact pane is no longer toggled when item is selected (#533).
To toggle it programatically, use NavigationViewState.toggleCompactOpenMode when an item is tapped
Dynamic header height for open pane (#530)
Fixes memory leaks on NavigationView
TreeView updates:
All items of the same depth level now have the same indentation. Before, only items with the same parent were aligned.
The hitbox for the expand icon of each item now uses the item's full height and is three times wider than the actual icon. This corresponds to the implementation in the explorer of Windows 10/11.
You can now choose whether the items of a TreeView should use narrow or wide spacing.
Do not invoke the tree view item on secondary tap (#526)
BREAKING TreeView.onSecondaryTap is now a (TreeViewItem item, TapDownDetails details) callback:
Before:
TreeView(
...,
onSecondaryTap: (item, offset) async {}
),
Now:
TreeView(
...,
onSecondaryTap: (item, details) {
final offset = details.globalPosition;
},
)
Expand/collape items with right and left arrow keys, respectively (#517)
Added TreeView.onItemExpandToggle and TreeViewItem.onExpandToggle (#522)
BREAKING AutoSuggestBox dynamic type support (#441):
Before:
AutoSuggestBox(
items: cats.map((cat) {
return AutoSuggestBoxItem(
value: cat,
onFocusChange: (focused) {
if (focused) debugPrint('Focused $cat');
}
);
}).toList(),
onSelected: (item) {
setState(() => selected = item);
},
),
Now:
AutoSuggestBox<String>(
items: cats.map((cat) {
return AutoSuggestBoxItem<String>(
value: cat,
label: cat,
onFocusChange: (focused) {
if (focused) debugPrint('Focused \$cat');
}
);
}).toList(),
onSelected: (item) {
setState(() => selected = item);
},
),
DisableAcrylic now fully disable transparency of its decendents Acrylics
DisableAcrylic now fully disable transparency of its decendents Acrylics (#468)TabView (#430)TimePicker popup when already rebuilding (#437)ToggleSwitch updates:
TextChangedReason.cleared, which is called when the text is cleared by the user in an AutoSuggestBox (#461)AutoSuggestBox.onChanged when an item is selected using the keyboard (#483)Tooltip overlay is now ignored when hovered (#443)DropdownButton (#475)ComboBox updates:
Combobox to ComboBoxComboboxItem to ComboBoxItemComboBox.backgroundColor to ComboBox.popupColorEditableComboBox, a combo box that accepts items that aren't listed (#244)ComboBox.isExpanded: false now correctly sets the button width (#382)ComboBox's items height are correctly calculated, as well as initial scroll offset (#472)ComboBox.disabledHint was renamed to ComboBox.disabledPlaceholderComboBoxFormField and EditableComboBoxFormField (#373)ComboBox.comboBoxColor is now correctly applied (#468)ComboBox popup can't be opened if disabledPaneItemExpander (#299)TimePicker and DatePicker popup now needs a minimum width of 260 (#494)NavigationAppBar content (#494)InfoLabel.rich. InfoLabel is no longer a constant contructor (#494)GlobalMaterialLocalizations above ReorderableListView (#492)ContentDialog.backgroundDismiss. Use showDialog.barrierDismissable (#490)DatePicker and TimePicker now show the focus highlight.
Their popup now can be controlled using the keyboardNavigationBody now uses a FocusTraversalGroup to handle focus
This means the the content of the body will be fully traversed before moving on to another widget or group of widgets. Learn moreTreeViewItem now shows the focus highlight. They can also be selected using the keyboardExpander now shows the focus highlightAutoSuggestBox.enabled (#504)NavigationView animation state (cf0fae1 ,bd89ba6)selected for all parents as soon as the TreeView is builtWhen top overflow menu is opened, PaneItemHeader no longer throws an unsupported error
NavigationView mode fixes:
PaneItemHeader no longer throws an unsupported errorPaneItemHeader is properly aligned to the other items.NavigationPaneThemeData.headerPadding, which is applied to PaneItemHeader on open, compact and minimal mode. It defaults to 10 pixels at the topPaneItem.getPropertyFromTitle is now widget.getProperty:Before:
getPropertyFromTitle<TextStyle>()
Now:
title.getProperty<TextStyle>()
This was changed because the properties of PaneItemHeader needed to be accessed, but the old version only supported to get the properties of PaneItem.title. It can be called on a Text, RichText or in an Icon widget
InheritedNavigationView is now accessible on the top overflow menuNavigationPaneThemeData.selectedTopTextStyle and NavigationPaneThemeData.unselectedTopTextStyle, which is applied to the items on top modecontent focus on minimal modeHorizontalSlidePageTransitionFix incorrect translation of TimePicker in Traditional Chinese.
Added ScaffoldPage.resizeToAvoidBottomInset (#444)
Consider view padding for NavigationAppBar
Scrollbar updates (#356):
backgroundColor to display the track colorpadding and hoveringPaddingUpdate AutoSuggestBox (#450):
.enableKeyboardControls. When true, items can be selected using the keyboard (#19).sorter, which lets you set a custom sort function for the suggestions. AutoSuggestBox.defaultItemSorter is used by defaultviewPadding is also taken into consideration.items can be dynamically loaded (#387).items is now a List<AutoSuggestBoxItem>:
Before:AutoSuggestBox(
items: [
'Cat',
'Dog',
'Bird',
'Horse',
],
...
),
Now:
AutoSuggestBox(
items: [
'Cat',
'Dog',
'Bird',
'Horse',
].map((animal) {
return AutoSuggestBoxItem(
value: animal, // this takes a String
child: Text('Animal $animal'), // this takes a Widget. If null, value is displayed as a text
onFocusChange: (focused) {
// this is called when the item is focused using the keyboard arrow keys
if (focused) debugPrint('Focused animal $animal');
},
onSelected: () {
// this is called when the item is selected
debugPrint('Selected animal $animal');
}
);
}).toList(),
...
)
Combobox updates (#454):
Correctly check if a locale is supported (#455)
Remove whitespace on ContentDialog if title is omitted
Remove whitespace on ContentDialog if title is omitted (#418)
Apply correct color to the Date and Time Pickers button when selected (#415, #417)
Expose more useful properties to AutoSuggestBox (#419)
BREAKING PopupContentSizeInfo was renamed to ContentSizeInfo
Reworked ListTile (#422):
TappableListTileListTile.selectable (#409)Reviewed animation durations (#421)
.animationDuration and .animationCurve from ScrollbarThemeDataexpandContractAnimationDuration and contractDelay to ScrollbarThemeDataNavigationPaneSize constraints are now correctly applied when in open mode (#336)
NavigationIndicator can't be invisble anymore when animation is stale (#335)
Updated TabView:
BREAKING Removed TabView.bodies. Now, Tab.body is used.
Before
TabView(
tabs: [
Tab(text: Text('Tab 1')),
Tab(text: Text('Tab 2')),
],
bodies: [
Tab1Body(),
Tab2Body(),
],
),
Now:
TabView(
tabs: [
Tab(
text: Text('Tab 1'),
body: Tab1Body(),
),
Tab(
text: Text('Tab 2'),
body: Tab2Body(),
),
],
),
Updated TabView tabs' constraints and padding
Fixed tab width when TabWidthBehavior is compact
FlutterLogo is no longer the default tab Icon
DropDownButton menu is now sized correctly according to the screen size
If there isn't enough space to display the menu on the preferred position, Flyout will display on the opposite position (#435)
Exposed private properties that makes it easier to create custom panes for NavigationView (#365):
Exposed private properties that makes it easier to create custom panes for NavigationView (#365):
kCompactNavigationPaneWidthkOpenNavigationPaneWidthNavigationPane.changeToPaneItem.getPropertyFromTitlePaneScrollConfiguration is now applied to custom pane on NavigationView
Added NavigationViewState.displayMode. It results in the current display mode used by the view, including the automatic display mode (#360):
// Define the key
final key = GlobalKey<NavigationViewState>();
NavigationView(
// pass the key to the view
key: key,
...,
)
// Get the current display mode. Note that, in order to find out the automatic display mode,
// the widget must have been built at least once
final PaneDisplayMode currentDisplayMode = key.currentState.displayMode;
The app bar action no longer overflow when minimal pane/compact overlay is open (#361)
Update AutoSuggestBox:
Acrylic, but it can be disabled using DisableAcrylicTextChangedReason.suggestionChoosen is now called properlyUpdated TextBox:
TextBox colors were updated to match the Win 11 design.Acrylic. Its items were also updatedUpdated pickers (#406):
selected is null, a placeholder text is shown (#306)hour, minute, AM, PM, month, dayand year..hourPlaceholder, .minutePlaceholder, .amText, .pmText from TimePicker. It was replaced, respectivelly, by the hour, minute, AM, PM localization messagesDatePicker, it's now possible to change the order of the fields:DatePicker(
...,
fieldOrder: [
DatePickerField.day,
DatePickerField.month,
DatePickerField.year,
],
)
The fields are ordered based on the current locale by default
DatePicker, the day and year fields are now formatted based on the current locale (getDateOrderFromLocale)Update Slider (#405):
.thumbRadius and .trackHeight to SliderThemeDataShow menu button on automatic minimal display mode
Show menu button on automatic minimal display mode (#350)
BREAKING Map<ShortcutActivator, Intent>? is now the typed used on FluentApp.shortcuts (#351)
TextBox review (#352):
.initialValue, .selectionControls, .mouseCursor, .textDirection, .scribbleEnabled and .enableIMEPersonalizedLearning to TextBoxAutoFillClient to TextBoxUnmanagedRestorationScope to TextFormBoxAdded AutoSuggestBox.form, that uses TextFormBox instead of TextBox (#353)
Do not overflow when text is too long on Chip (#322)
Add RTL support for Chip
Card updates:
Card.elevationCard.margin, which is the margin around the cardUpdated Combobox and Button designs
Updated NavigationPane behaviour. Now, if the header is null, the space it should have taken will be removed from the pane (display mode affected: minimal, open only) (#359)
Reviewed DatePicker and TimePicker (#357)
Colors Update (#368):
Added ResourceDictionary, which provides default colors to be used on components
(forms) Updated Combobox style. It now uses Acrylic on the combobox popup menu
(buttons) Updated Button, FilledButton, IconButton and TextButton styles
(toggleable inputs) Updated Checkbox, Chip, RadioButton, RatingBar, ToggleButton and ToggleSwitch
BREAKING Updated Slider:
SliderThemeData.thumbColor, SliderThemeData.activeColor and SliderThemeData.inactiveColor now are of type ButtonState<Color?>?, which handles the button color on different states. SliderThemeData.disabledThumbColor, SliderThemeData.disabledActiveColor and SliderThemeData.disabledInactiveColor were removedSliderThemeData(
thumbColor: Colors.green,
),
SliderThemeData(
// Apply Colors.green for all button states. Instead you can use ButtonState.resolveWith to use different values according to the current state
thumbColor: ButtonState.all(Colors.green),
),
(navigation) Updated NavigationView, PaneItem and ScaffoldPage
TabView and its tabs styles. A FocusBorder is now used to display the focus highlight of the tabsBorderRadius can now be used on FocusBorder(surfaces) Updated Card, ContentDialog, InfoBar, Expander, Flyout and `Divider``
InfoBar.isIconVisible(indicators) Updated ProgressBar, ProgressRing and InfoBadge
(other) Added helper methods for AccentColor: AccentColor.defaultBrushFor, AccentColor.secondaryBrushFor and AccentColor.tertiaryBrushFor
Polish translation added
Add support for Flutter 3.0 (Fixes #186, #327)
Your coding agent can read these notes before it upgrades. Set up the MCP server →