Skip to content

Commit 1887bc4

Browse files
Implementing switch expressions in lib/src/material/ (#142793)
This PR is the 6�ʰ step in the journey to solve issue #136139 and make the entire Flutter repo more readable. (previous pull requests: #139048, #139882, #141591, #142279, #142634) The current focus is on `packages/flutter/lib/src/material/`. The previous 2 PRs covered files in this directory starting with letters `a-m`; this one takes care of everything else.
1 parent fa71e80 commit 1887bc4

18 files changed

+182
-339
lines changed

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

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -866,14 +866,10 @@ mixin _ZoomTransitionBase<S extends StatefulWidget> on State<S> {
866866
}
867867

868868
void onAnimationStatusChange(AnimationStatus status) {
869-
switch (status) {
870-
case AnimationStatus.dismissed:
871-
case AnimationStatus.completed:
872-
controller.allowSnapshotting = false;
873-
case AnimationStatus.forward:
874-
case AnimationStatus.reverse:
875-
controller.allowSnapshotting = useSnapshot;
876-
}
869+
controller.allowSnapshotting = switch (status) {
870+
AnimationStatus.dismissed || AnimationStatus.completed => false,
871+
AnimationStatus.forward || AnimationStatus.reverse => useSnapshot,
872+
};
877873
}
878874

879875
@override

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

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -730,12 +730,10 @@ class _PopupMenuRouteLayout extends SingleChildLayoutDelegate {
730730
x = position.left;
731731
} else {
732732
// Menu button is equidistant from both edges, so grow in reading direction.
733-
switch (textDirection) {
734-
case TextDirection.rtl:
735-
x = size.width - position.right - childSize.width;
736-
case TextDirection.ltr:
737-
x = position.left;
738-
}
733+
x = switch (textDirection) {
734+
TextDirection.rtl => size.width - position.right - childSize.width,
735+
TextDirection.ltr => position.left,
736+
};
739737
}
740738
final Offset wantedPosition = Offset(x, y);
741739
final Offset originCenter = position.toRect(Offset.zero & size).center;
@@ -1395,12 +1393,10 @@ class PopupMenuButtonState<T> extends State<PopupMenuButton<T>> {
13951393

13961394
bool get _canRequestFocus {
13971395
final NavigationMode mode = MediaQuery.maybeNavigationModeOf(context) ?? NavigationMode.traditional;
1398-
switch (mode) {
1399-
case NavigationMode.traditional:
1400-
return widget.enabled;
1401-
case NavigationMode.directional:
1402-
return true;
1403-
}
1396+
return switch (mode) {
1397+
NavigationMode.traditional => widget.enabled,
1398+
NavigationMode.directional => true,
1399+
};
14041400
}
14051401

14061402
@override

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -191,13 +191,10 @@ class _LinearProgressIndicatorPainter extends CustomPainter {
191191
return;
192192
}
193193

194-
final double left;
195-
switch (textDirection) {
196-
case TextDirection.rtl:
197-
left = size.width - width - x;
198-
case TextDirection.ltr:
199-
left = x;
200-
}
194+
final double left = switch (textDirection) {
195+
TextDirection.rtl => size.width - width - x,
196+
TextDirection.ltr => x,
197+
};
201198

202199
final Rect rect = Offset(left, 0.0) & Size(width, size.height);
203200
if (indicatorBorderRadius != BorderRadius.zero) {

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -453,13 +453,10 @@ class _RadioState<T> extends State<Radio<T>> with TickerProviderStateMixin, Togg
453453
final VisualDensity effectiveVisualDensity = widget.visualDensity
454454
?? radioTheme.visualDensity
455455
?? defaults.visualDensity!;
456-
Size size;
457-
switch (effectiveMaterialTapTargetSize) {
458-
case MaterialTapTargetSize.padded:
459-
size = const Size(kMinInteractiveDimension, kMinInteractiveDimension);
460-
case MaterialTapTargetSize.shrinkWrap:
461-
size = const Size(kMinInteractiveDimension - 8.0, kMinInteractiveDimension - 8.0);
462-
}
456+
Size size = switch (effectiveMaterialTapTargetSize) {
457+
MaterialTapTargetSize.padded => const Size(kMinInteractiveDimension, kMinInteractiveDimension),
458+
MaterialTapTargetSize.shrinkWrap => const Size(kMinInteractiveDimension - 8.0, kMinInteractiveDimension - 8.0),
459+
};
463460
size += effectiveVisualDensity.baseSizeAdjustment;
464461

465462
final MaterialStateProperty<MouseCursor> effectiveMouseCursor = MaterialStateProperty.resolveWith<MouseCursor>((Set<MaterialState> states) {

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -485,15 +485,10 @@ class RadioListTile<T> extends StatelessWidget {
485485
}
486486

487487
Widget? leading, trailing;
488-
switch (controlAffinity) {
489-
case ListTileControlAffinity.leading:
490-
case ListTileControlAffinity.platform:
491-
leading = control;
492-
trailing = secondary;
493-
case ListTileControlAffinity.trailing:
494-
leading = secondary;
495-
trailing = control;
496-
}
488+
(leading, trailing) = switch (controlAffinity) {
489+
ListTileControlAffinity.leading || ListTileControlAffinity.platform => (control, secondary),
490+
ListTileControlAffinity.trailing => (secondary, control),
491+
};
497492
final ThemeData theme = Theme.of(context);
498493
final RadioThemeData radioThemeData = RadioTheme.of(context);
499494
final Set<MaterialState> states = <MaterialState>{

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

Lines changed: 26 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -558,16 +558,10 @@ class _RangeSliderState extends State<RangeSlider> with TickerProviderStateMixin
558558
// thumb selection is determined by the direction of the dx. The left thumb
559559
// is chosen for negative dx, and the right thumb is chosen for positive dx.
560560
if (inStartTouchTarget && inEndTouchTarget) {
561-
final bool towardsStart;
562-
final bool towardsEnd;
563-
switch (textDirection) {
564-
case TextDirection.ltr:
565-
towardsStart = dx < 0;
566-
towardsEnd = dx > 0;
567-
case TextDirection.rtl:
568-
towardsStart = dx > 0;
569-
towardsEnd = dx < 0;
570-
}
561+
final (bool towardsStart, bool towardsEnd) = switch (textDirection) {
562+
TextDirection.ltr => (dx < 0, dx > 0),
563+
TextDirection.rtl => (dx > 0, dx < 0),
564+
};
571565
if (towardsStart) {
572566
return Thumb.start;
573567
}
@@ -1102,16 +1096,12 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
11021096
}
11031097

11041098
bool get showValueIndicator {
1105-
switch (_sliderTheme.showValueIndicator!) {
1106-
case ShowValueIndicator.onlyForDiscrete:
1107-
return isDiscrete;
1108-
case ShowValueIndicator.onlyForContinuous:
1109-
return !isDiscrete;
1110-
case ShowValueIndicator.always:
1111-
return true;
1112-
case ShowValueIndicator.never:
1113-
return false;
1114-
}
1099+
return switch (_sliderTheme.showValueIndicator!) {
1100+
ShowValueIndicator.onlyForDiscrete => isDiscrete,
1101+
ShowValueIndicator.onlyForContinuous => !isDiscrete,
1102+
ShowValueIndicator.always => true,
1103+
ShowValueIndicator.never => false,
1104+
};
11151105
}
11161106

11171107
Size get _thumbSize => _sliderTheme.rangeThumbShape!.getPreferredSize(isEnabled, isDiscrete);
@@ -1142,16 +1132,10 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
11421132
return;
11431133
}
11441134

1145-
final String text;
1146-
final TextPainter labelPainter;
1147-
switch (thumb) {
1148-
case Thumb.start:
1149-
text = labels.start;
1150-
labelPainter = _startLabelPainter;
1151-
case Thumb.end:
1152-
text = labels.end;
1153-
labelPainter = _endLabelPainter;
1154-
}
1135+
final (String text, TextPainter labelPainter) = switch (thumb) {
1136+
Thumb.start => (labels.start, _startLabelPainter),
1137+
Thumb.end => (labels.end, _endLabelPainter),
1138+
};
11551139

11561140
labelPainter
11571141
..text = TextSpan(
@@ -1205,12 +1189,10 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
12051189
}
12061190

12071191
double _getValueFromVisualPosition(double visualPosition) {
1208-
switch (textDirection) {
1209-
case TextDirection.rtl:
1210-
return 1.0 - visualPosition;
1211-
case TextDirection.ltr:
1212-
return visualPosition;
1213-
}
1192+
return switch (textDirection) {
1193+
TextDirection.rtl => 1.0 - visualPosition,
1194+
TextDirection.ltr => visualPosition,
1195+
};
12141196
}
12151197

12161198
double _getValueFromGlobalPosition(Offset globalPosition) {
@@ -1399,16 +1381,10 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
13991381
// The visual position is the position of the thumb from 0 to 1 from left
14001382
// to right. In left to right, this is the same as the value, but it is
14011383
// reversed for right to left text.
1402-
final double startVisualPosition;
1403-
final double endVisualPosition;
1404-
switch (textDirection) {
1405-
case TextDirection.rtl:
1406-
startVisualPosition = 1.0 - startValue;
1407-
endVisualPosition = 1.0 - endValue;
1408-
case TextDirection.ltr:
1409-
startVisualPosition = startValue;
1410-
endVisualPosition = endValue;
1411-
}
1384+
final (double startVisualPosition, double endVisualPosition) = switch (textDirection) {
1385+
TextDirection.rtl => (1.0 - startValue, 1.0 - endValue),
1386+
TextDirection.ltr => (startValue, endValue),
1387+
};
14121388

14131389
final Rect trackRect = _sliderTheme.rangeTrackShape!.getPreferredRect(
14141390
parentBox: this,
@@ -1585,15 +1561,10 @@ class _RenderRangeSlider extends RenderBox with RelayoutWhenSystemFontsChangeMix
15851561
labelPainter: _endLabelPainter,
15861562
textScaleFactor: textScaleFactor,
15871563
).width / 2;
1588-
double innerOverflow = startHalfWidth + endHalfWidth;
1589-
switch (textDirection) {
1590-
case TextDirection.ltr:
1591-
innerOverflow += startOffset;
1592-
innerOverflow -= endOffset;
1593-
case TextDirection.rtl:
1594-
innerOverflow -= startOffset;
1595-
innerOverflow += endOffset;
1596-
}
1564+
final double innerOverflow = startHalfWidth + endHalfWidth + switch (textDirection) {
1565+
TextDirection.ltr => startOffset - endOffset,
1566+
TextDirection.rtl => endOffset - startOffset,
1567+
};
15971568

15981569
_state.paintTopValueIndicator = (PaintingContext context, Offset offset) {
15991570
if (attached) {

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -357,15 +357,10 @@ class RefreshIndicatorState extends State<RefreshIndicator> with TickerProviderS
357357
});
358358
return false;
359359
}
360-
bool? indicatorAtTopNow;
361-
switch (notification.metrics.axisDirection) {
362-
case AxisDirection.down:
363-
case AxisDirection.up:
364-
indicatorAtTopNow = true;
365-
case AxisDirection.left:
366-
case AxisDirection.right:
367-
indicatorAtTopNow = null;
368-
}
360+
final bool? indicatorAtTopNow = switch (notification.metrics.axisDirection) {
361+
AxisDirection.down || AxisDirection.up => true,
362+
AxisDirection.left || AxisDirection.right => null,
363+
};
369364
if (indicatorAtTopNow != _isIndicatorAtTop) {
370365
if (_mode == _RefreshIndicatorMode.drag || _mode == _RefreshIndicatorMode.armed) {
371366
_dismiss(_RefreshIndicatorMode.canceled);

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

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -874,13 +874,10 @@ class _SliderState extends State<Slider> with TickerProviderStateMixin {
874874
};
875875
}
876876

877-
final Map<ShortcutActivator, Intent> shortcutMap;
878-
switch (MediaQuery.navigationModeOf(context)) {
879-
case NavigationMode.directional:
880-
shortcutMap = _directionalNavShortcutMap;
881-
case NavigationMode.traditional:
882-
shortcutMap = _traditionalNavShortcutMap;
883-
}
877+
final Map<ShortcutActivator, Intent> shortcutMap = switch (MediaQuery.navigationModeOf(context)) {
878+
NavigationMode.directional => _directionalNavShortcutMap,
879+
NavigationMode.traditional => _traditionalNavShortcutMap,
880+
};
884881

885882
final double fontSize = sliderTheme.valueIndicatorTextStyle?.fontSize ?? kDefaultFontSize;
886883
final double fontSizeToScale = fontSize == 0.0 ? kDefaultFontSize : fontSize;
@@ -1386,16 +1383,12 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
13861383
}
13871384

13881385
bool get showValueIndicator {
1389-
switch (_sliderTheme.showValueIndicator!) {
1390-
case ShowValueIndicator.onlyForDiscrete:
1391-
return isDiscrete;
1392-
case ShowValueIndicator.onlyForContinuous:
1393-
return !isDiscrete;
1394-
case ShowValueIndicator.always:
1395-
return true;
1396-
case ShowValueIndicator.never:
1397-
return false;
1398-
}
1386+
return switch (_sliderTheme.showValueIndicator!) {
1387+
ShowValueIndicator.onlyForDiscrete => isDiscrete,
1388+
ShowValueIndicator.onlyForContinuous => !isDiscrete,
1389+
ShowValueIndicator.always => true,
1390+
ShowValueIndicator.never => false,
1391+
};
13991392
}
14001393

14011394
double get _adjustmentUnit {
@@ -1466,12 +1459,10 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
14661459
}
14671460

14681461
double _getValueFromVisualPosition(double visualPosition) {
1469-
switch (textDirection) {
1470-
case TextDirection.rtl:
1471-
return 1.0 - visualPosition;
1472-
case TextDirection.ltr:
1473-
return visualPosition;
1474-
}
1462+
return switch (textDirection) {
1463+
TextDirection.rtl => 1.0 - visualPosition,
1464+
TextDirection.ltr => visualPosition,
1465+
};
14751466
}
14761467

14771468
double _getValueFromGlobalPosition(Offset globalPosition) {
@@ -1566,12 +1557,10 @@ class _RenderSlider extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
15661557
case SliderInteraction.slideThumb:
15671558
if (_active && isInteractive) {
15681559
final double valueDelta = details.primaryDelta! / _trackRect.width;
1569-
switch (textDirection) {
1570-
case TextDirection.rtl:
1571-
_currentDragValue -= valueDelta;
1572-
case TextDirection.ltr:
1573-
_currentDragValue += valueDelta;
1574-
}
1560+
_currentDragValue += switch (textDirection) {
1561+
TextDirection.rtl => -valueDelta,
1562+
TextDirection.ltr => valueDelta,
1563+
};
15751564
onChanged!(_discretize(_currentDragValue));
15761565
}
15771566
case SliderInteraction.tapOnly:

0 commit comments

Comments
 (0)