Skip to content

Commit 5b947c8

Browse files
Implement switch expressions in lib/src/material/ (#142634)
This PR is step 5 in the journey to solve issue #136139 and make the entire Flutter repo more readable. (previous pull requests: #139048, #139882, #141591, #142279) The current focus is on `packages/flutter/lib/src/material/`. The previous PR covered files in this directory starting with `a`, `b`, and `c`; this pull request is for `d` through `m`.
1 parent 81574cb commit 5b947c8

12 files changed

+146
-256
lines changed

packages/flutter/lib/src/material/dropdown.dart

Lines changed: 17 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,10 @@ class _DropdownMenuItemButton<T> extends StatefulWidget {
119119

120120
class _DropdownMenuItemButtonState<T> extends State<_DropdownMenuItemButton<T>> {
121121
void _handleFocusChange(bool focused) {
122-
final bool inTraditionalMode;
123-
switch (FocusManager.instance.highlightMode) {
124-
case FocusHighlightMode.touch:
125-
inTraditionalMode = false;
126-
case FocusHighlightMode.traditional:
127-
inTraditionalMode = true;
128-
}
122+
final bool inTraditionalMode = switch (FocusManager.instance.highlightMode) {
123+
FocusHighlightMode.touch => false,
124+
FocusHighlightMode.traditional => true,
125+
};
129126

130127
if (focused && inTraditionalMode) {
131128
final _MenuLimits menuLimits = widget.route.getMenuLimits(
@@ -377,13 +374,10 @@ class _DropdownMenuRouteLayout<T> extends SingleChildLayoutDelegate {
377374
return true;
378375
}());
379376
assert(textDirection != null);
380-
final double left;
381-
switch (textDirection!) {
382-
case TextDirection.rtl:
383-
left = clampDouble(buttonRect.right, 0.0, size.width) - childSize.width;
384-
case TextDirection.ltr:
385-
left = clampDouble(buttonRect.left, 0.0, size.width - childSize.width);
386-
}
377+
final double left = switch (textDirection!) {
378+
TextDirection.rtl => clampDouble(buttonRect.right, 0.0, size.width) - childSize.width,
379+
TextDirection.ltr => clampDouble(buttonRect.left, 0.0, size.width - childSize.width),
380+
};
387381

388382
return Offset(left, menuLimits.top);
389383
}
@@ -1379,28 +1373,17 @@ class _DropdownButtonState<T> extends State<DropdownButton<T>> with WidgetsBindi
13791373

13801374
Color get _iconColor {
13811375
// These colors are not defined in the Material Design spec.
1376+
final Brightness brightness = Theme.of(context).brightness;
13821377
if (_enabled) {
1383-
if (widget.iconEnabledColor != null) {
1384-
return widget.iconEnabledColor!;
1385-
}
1386-
1387-
switch (Theme.of(context).brightness) {
1388-
case Brightness.light:
1389-
return Colors.grey.shade700;
1390-
case Brightness.dark:
1391-
return Colors.white70;
1392-
}
1378+
return widget.iconEnabledColor ?? switch (brightness) {
1379+
Brightness.light => Colors.grey.shade700,
1380+
Brightness.dark => Colors.white70,
1381+
};
13931382
} else {
1394-
if (widget.iconDisabledColor != null) {
1395-
return widget.iconDisabledColor!;
1396-
}
1397-
1398-
switch (Theme.of(context).brightness) {
1399-
case Brightness.light:
1400-
return Colors.grey.shade400;
1401-
case Brightness.dark:
1402-
return Colors.white10;
1403-
}
1383+
return widget.iconDisabledColor ?? switch (brightness) {
1384+
Brightness.light => Colors.grey.shade400,
1385+
Brightness.dark => Colors.white10,
1386+
};
14041387
}
14051388
}
14061389

packages/flutter/lib/src/material/dropdown_menu.dart

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -546,17 +546,10 @@ class _DropdownMenuState<T> extends State<DropdownMenu<T>> {
546546
// paddings so its leading icon will be aligned with the leading icon of
547547
// the text field.
548548
final double padding = entry.leadingIcon == null ? (leadingPadding ?? _kDefaultHorizontalPadding) : _kDefaultHorizontalPadding;
549-
final ButtonStyle defaultStyle;
550-
switch (textDirection) {
551-
case TextDirection.rtl:
552-
defaultStyle = MenuItemButton.styleFrom(
553-
padding: EdgeInsets.only(left: _kDefaultHorizontalPadding, right: padding),
554-
);
555-
case TextDirection.ltr:
556-
defaultStyle = MenuItemButton.styleFrom(
557-
padding: EdgeInsets.only(left: padding, right: _kDefaultHorizontalPadding),
558-
);
559-
}
549+
final ButtonStyle defaultStyle = switch (textDirection) {
550+
TextDirection.rtl => MenuItemButton.styleFrom(padding: EdgeInsets.only(left: _kDefaultHorizontalPadding, right: padding)),
551+
TextDirection.ltr => MenuItemButton.styleFrom(padding: EdgeInsets.only(left: padding, right: _kDefaultHorizontalPadding)),
552+
};
560553

561554
ButtonStyle effectiveStyle = entry.style ?? defaultStyle;
562555
final Color focusedBackgroundColor = effectiveStyle.foregroundColor?.resolve(<MaterialState>{MaterialState.focused})

packages/flutter/lib/src/material/expand_icon.dart

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,10 @@ class _ExpandIconState extends State<ExpandIcon> with SingleTickerProviderStateM
152152
return widget.color!;
153153
}
154154

155-
switch (Theme.of(context).brightness) {
156-
case Brightness.light:
157-
return Colors.black54;
158-
case Brightness.dark:
159-
return Colors.white60;
160-
}
155+
return switch (Theme.of(context).brightness) {
156+
Brightness.light => Colors.black54,
157+
Brightness.dark => Colors.white60,
158+
};
161159
}
162160

163161
@override

packages/flutter/lib/src/material/filled_button.dart

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -425,12 +425,10 @@ class FilledButton extends ButtonStyleButton {
425425
/// [padding] is reduced from 24 to 16.
426426
@override
427427
ButtonStyle defaultStyleOf(BuildContext context) {
428-
switch (_variant) {
429-
case _FilledButtonVariant.filled:
430-
return _FilledButtonDefaultsM3(context);
431-
case _FilledButtonVariant.tonal:
432-
return _FilledTonalButtonDefaultsM3(context);
433-
}
428+
return switch (_variant) {
429+
_FilledButtonVariant.filled => _FilledButtonDefaultsM3(context),
430+
_FilledButtonVariant.tonal => _FilledTonalButtonDefaultsM3(context),
431+
};
434432
}
435433

436434
/// Returns the [FilledButtonThemeData.style] of the closest

packages/flutter/lib/src/material/flexible_space_bar.dart

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -185,32 +185,20 @@ class FlexibleSpaceBar extends StatefulWidget {
185185

186186
class _FlexibleSpaceBarState extends State<FlexibleSpaceBar> {
187187
bool _getEffectiveCenterTitle(ThemeData theme) {
188-
if (widget.centerTitle != null) {
189-
return widget.centerTitle!;
190-
}
191-
switch (theme.platform) {
192-
case TargetPlatform.android:
193-
case TargetPlatform.fuchsia:
194-
case TargetPlatform.linux:
195-
case TargetPlatform.windows:
196-
return false;
197-
case TargetPlatform.iOS:
198-
case TargetPlatform.macOS:
199-
return true;
200-
}
188+
return widget.centerTitle ?? switch (theme.platform) {
189+
TargetPlatform.android || TargetPlatform.fuchsia || TargetPlatform.linux || TargetPlatform.windows => false,
190+
TargetPlatform.iOS || TargetPlatform.macOS => true,
191+
};
201192
}
202193

203194
Alignment _getTitleAlignment(bool effectiveCenterTitle) {
204195
if (effectiveCenterTitle) {
205196
return Alignment.bottomCenter;
206197
}
207-
final TextDirection textDirection = Directionality.of(context);
208-
switch (textDirection) {
209-
case TextDirection.rtl:
210-
return Alignment.bottomRight;
211-
case TextDirection.ltr:
212-
return Alignment.bottomLeft;
213-
}
198+
return switch (Directionality.of(context)) {
199+
TextDirection.rtl => Alignment.bottomRight,
200+
TextDirection.ltr => Alignment.bottomLeft,
201+
};
214202
}
215203

216204
double _getCollapsePadding(double t, FlexibleSpaceBarSettings settings) {

packages/flutter/lib/src/material/floating_action_button.dart

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -814,26 +814,22 @@ class _FABDefaultsM3 extends FloatingActionButtonThemeData {
814814

815815
@override
816816
ShapeBorder? get shape {
817-
switch (type) {
818-
case _FloatingActionButtonType.regular:
819-
return const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16.0)));
820-
case _FloatingActionButtonType.small:
821-
return const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12.0)));
822-
case _FloatingActionButtonType.large:
823-
return const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(28.0)));
824-
case _FloatingActionButtonType.extended:
825-
return const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16.0)));
826-
}
817+
return switch (type) {
818+
_FloatingActionButtonType.regular => const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16.0))),
819+
_FloatingActionButtonType.small => const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(12.0))),
820+
_FloatingActionButtonType.large => const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(28.0))),
821+
_FloatingActionButtonType.extended => const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(16.0))),
822+
};
827823
}
828824

829825
@override
830826
double? get iconSize {
831-
switch (type) {
832-
case _FloatingActionButtonType.regular: return 24.0;
833-
case _FloatingActionButtonType.small: return 24.0;
834-
case _FloatingActionButtonType.large: return 36.0;
835-
case _FloatingActionButtonType.extended: return 24.0;
836-
}
827+
return switch (type) {
828+
_FloatingActionButtonType.regular => 24.0,
829+
_FloatingActionButtonType.small => 24.0,
830+
_FloatingActionButtonType.large => 36.0,
831+
_FloatingActionButtonType.extended => 24.0,
832+
};
837833
}
838834

839835
@override EdgeInsetsGeometry? get extendedPadding => EdgeInsetsDirectional.only(start: hasChild && _isExtended ? 16.0 : 20.0, end: 20.0);

packages/flutter/lib/src/material/floating_action_button_location.dart

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -656,12 +656,10 @@ mixin FabStartOffsetX on StandardFabLocation {
656656
/// Calculates x-offset for start-aligned [FloatingActionButtonLocation]s.
657657
@override
658658
double getOffsetX(ScaffoldPrelayoutGeometry scaffoldGeometry, double adjustment) {
659-
switch (scaffoldGeometry.textDirection) {
660-
case TextDirection.rtl:
661-
return StandardFabLocation._rightOffsetX(scaffoldGeometry, adjustment);
662-
case TextDirection.ltr:
663-
return StandardFabLocation._leftOffsetX(scaffoldGeometry, adjustment);
664-
}
659+
return switch (scaffoldGeometry.textDirection) {
660+
TextDirection.rtl => StandardFabLocation._rightOffsetX(scaffoldGeometry, adjustment),
661+
TextDirection.ltr => StandardFabLocation._leftOffsetX(scaffoldGeometry, adjustment),
662+
};
665663
}
666664
}
667665

@@ -679,12 +677,10 @@ mixin FabEndOffsetX on StandardFabLocation {
679677
/// Calculates x-offset for end-aligned [FloatingActionButtonLocation]s.
680678
@override
681679
double getOffsetX(ScaffoldPrelayoutGeometry scaffoldGeometry, double adjustment) {
682-
switch (scaffoldGeometry.textDirection) {
683-
case TextDirection.rtl:
684-
return StandardFabLocation._leftOffsetX(scaffoldGeometry, adjustment);
685-
case TextDirection.ltr:
686-
return StandardFabLocation._rightOffsetX(scaffoldGeometry, adjustment);
687-
}
680+
return switch (scaffoldGeometry.textDirection) {
681+
TextDirection.rtl => StandardFabLocation._leftOffsetX(scaffoldGeometry, adjustment),
682+
TextDirection.ltr => StandardFabLocation._rightOffsetX(scaffoldGeometry, adjustment),
683+
};
688684
}
689685
}
690686

packages/flutter/lib/src/material/icon_button.dart

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -944,16 +944,12 @@ class _IconButtonM3 extends ButtonStyleButton {
944944
/// * `splashFactory` - Theme.splashFactory
945945
@override
946946
ButtonStyle defaultStyleOf(BuildContext context) {
947-
switch (variant) {
948-
case _IconButtonVariant.filled:
949-
return _FilledIconButtonDefaultsM3(context, toggleable);
950-
case _IconButtonVariant.filledTonal:
951-
return _FilledTonalIconButtonDefaultsM3(context, toggleable);
952-
case _IconButtonVariant.outlined:
953-
return _OutlinedIconButtonDefaultsM3(context, toggleable);
954-
case _IconButtonVariant.standard:
955-
return _IconButtonDefaultsM3(context, toggleable);
956-
}
947+
return switch (variant) {
948+
_IconButtonVariant.filled => _FilledIconButtonDefaultsM3(context, toggleable),
949+
_IconButtonVariant.filledTonal => _FilledTonalIconButtonDefaultsM3(context, toggleable),
950+
_IconButtonVariant.outlined => _OutlinedIconButtonDefaultsM3(context, toggleable),
951+
_IconButtonVariant.standard => _IconButtonDefaultsM3(context, toggleable),
952+
};
957953
}
958954

959955
/// Returns the [IconButtonThemeData.style] of the closest [IconButtonTheme] ancestor.

0 commit comments

Comments
 (0)