diff --git a/dev/benchmarks/macrobenchmarks/lib/src/very_long_picture_scrolling.dart b/dev/benchmarks/macrobenchmarks/lib/src/very_long_picture_scrolling.dart index fb6a7cf20b6..8e3a41ab92e 100644 --- a/dev/benchmarks/macrobenchmarks/lib/src/very_long_picture_scrolling.dart +++ b/dev/benchmarks/macrobenchmarks/lib/src/very_long_picture_scrolling.dart @@ -97,7 +97,7 @@ class PaintTest extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final double height = size.height; + final double halfHeight = size.height / 2; double x = 0; const double strokeSize = .5; const double zoomFactor = .5; @@ -125,19 +125,12 @@ class PaintTest extends CustomPainter { final Float32List offsets = Float32List(consolidate ? waveData.length * 4 : 4); int used = 0; for (index = 0; index < waveData.length; index++) { - Paint curPaint; - Offset p1; - if (waveData[index].isNegative) { - curPaint = paintPos; - p1 = Offset(x, height * 1 / 2 - waveData[index] / 32768 * (height / 2)); - } else if (waveData[index] == 0) { - curPaint = paintZero; - p1 = Offset(x, height * 1 / 2 + 1); - } else { - curPaint = (waveData[index] == 0) ? paintZero : paintNeg; - p1 = Offset(x, height * 1 / 2 - waveData[index] / 32767 * (height / 2)); - } - final Offset p0 = Offset(x, height * 1 / 2); + final (Paint curPaint, Offset p1) = switch (waveData[index]) { + < 0 => (paintPos, Offset(x, halfHeight * (1 - waveData[index] / 32768))), + > 0 => (paintNeg, Offset(x, halfHeight * (1 - waveData[index] / 32767))), + _ => (paintZero, Offset(x, halfHeight + 1)), + }; + final Offset p0 = Offset(x, halfHeight); if (consolidate) { if (listPaint != null && listPaint != curPaint) { canvas.drawRawPoints(PointMode.lines, offsets.sublist(0, used), listPaint); @@ -179,7 +172,7 @@ class PaintSomeTest extends CustomPainter { @override void paint(Canvas canvas, Size size) { - final double height = size.height; + final double halfHeight = size.height / 2; double x = 0; const double strokeSize = .5; const double zoomFactor = .5; @@ -203,19 +196,12 @@ class PaintSomeTest extends CustomPainter { ..style = PaintingStyle.stroke; for (int index = from; index <= to; index++) { - Paint curPaint; - Offset p1; - if (waveData[index].isNegative) { - curPaint = paintPos; - p1 = Offset(x, height * 1 / 2 - waveData[index] / 32768 * (height / 2)); - } else if (waveData[index] == 0) { - curPaint = paintZero; - p1 = Offset(x, height * 1 / 2 + 1); - } else { - curPaint = (waveData[index] == 0) ? paintZero : paintNeg; - p1 = Offset(x, height * 1 / 2 - waveData[index] / 32767 * (height / 2)); - } - final Offset p0 = Offset(x, height * 1 / 2); + final (Paint curPaint, Offset p1) = switch (waveData[index]) { + < 0 => (paintPos, Offset(x, halfHeight * (1 - waveData[index] / 32768))), + > 0 => (paintNeg, Offset(x, halfHeight * (1 - waveData[index] / 32767))), + _ => (paintZero, Offset(x, halfHeight + 1)), + }; + final Offset p0 = Offset(x, halfHeight); canvas.drawLine(p0, p1, curPaint); x += zoomFactor; } diff --git a/dev/manual_tests/lib/star_border.dart b/dev/manual_tests/lib/star_border.dart index d5096d06671..94fe03d7c09 100644 --- a/dev/manual_tests/lib/star_border.dart +++ b/dev/manual_tests/lib/star_border.dart @@ -474,58 +474,13 @@ const Color lerpToColor = Colors.red; const BorderSide lerpToBorder = BorderSide(width: 5, color: lerpToColor); ShapeBorder? lerpBorder(StarBorder border, LerpTarget target, double t, {bool to = true}) { - switch (target) { - case LerpTarget.circle: - if (to) { - return border.lerpTo(const CircleBorder(side: lerpToBorder, eccentricity: 0.5), t); - } else { - return border.lerpFrom(const CircleBorder(side: lerpToBorder, eccentricity: 0.5), t); - } - case LerpTarget.roundedRect: - if (to) { - return border.lerpTo( - const RoundedRectangleBorder( - side: lerpToBorder, - borderRadius: BorderRadius.all( - Radius.circular(10), - ), - ), - t, - ); - } else { - return border.lerpFrom( - const RoundedRectangleBorder( - side: lerpToBorder, - borderRadius: BorderRadius.all( - Radius.circular(10), - ), - ), - t, - ); - } - case LerpTarget.rect: - if (to) { - return border.lerpTo(const RoundedRectangleBorder(side: lerpToBorder), t); - } else { - return border.lerpFrom(const RoundedRectangleBorder(side: lerpToBorder), t); - } - case LerpTarget.stadium: - if (to) { - return border.lerpTo(const StadiumBorder(side: lerpToBorder), t); - } else { - return border.lerpFrom(const StadiumBorder(side: lerpToBorder), t); - } - case LerpTarget.polygon: - if (to) { - return border.lerpTo(const StarBorder.polygon(side: lerpToBorder, sides: 4), t); - } else { - return border.lerpFrom(const StarBorder.polygon(side: lerpToBorder, sides: 4), t); - } - case LerpTarget.star: - if (to) { - return border.lerpTo(const StarBorder(side: lerpToBorder, innerRadiusRatio: .5), t); - } else { - return border.lerpFrom(const StarBorder(side: lerpToBorder, innerRadiusRatio: .5), t); - } - } + final OutlinedBorder targetBorder = switch (target) { + LerpTarget.circle => const CircleBorder(side: lerpToBorder, eccentricity: 0.5), + LerpTarget.rect => const RoundedRectangleBorder(side: lerpToBorder), + LerpTarget.stadium => const StadiumBorder(side: lerpToBorder), + LerpTarget.polygon => const StarBorder.polygon(side: lerpToBorder, sides: 4), + LerpTarget.star => const StarBorder(side: lerpToBorder, innerRadiusRatio: 0.5), + LerpTarget.roundedRect => RoundedRectangleBorder(side: lerpToBorder, borderRadius: BorderRadius.circular(10)), + }; + return to ? border.lerpTo(targetBorder, t) : border.lerpFrom(targetBorder, t); } diff --git a/packages/flutter/lib/src/material/data_table.dart b/packages/flutter/lib/src/material/data_table.dart index 7ff504e28bd..30ee7b565f3 100644 --- a/packages/flutter/lib/src/material/data_table.dart +++ b/packages/flutter/lib/src/material/data_table.dart @@ -1080,16 +1080,11 @@ class DataTable extends StatelessWidget { for (int dataColumnIndex = 0; dataColumnIndex < columns.length; dataColumnIndex += 1) { final DataColumn column = columns[dataColumnIndex]; - final double paddingStart; - if (dataColumnIndex == 0 && displayCheckboxColumn && checkboxHorizontalMargin != null) { - paddingStart = effectiveHorizontalMargin; - } else if (dataColumnIndex == 0 && displayCheckboxColumn) { - paddingStart = effectiveHorizontalMargin / 2.0; - } else if (dataColumnIndex == 0 && !displayCheckboxColumn) { - paddingStart = effectiveHorizontalMargin; - } else { - paddingStart = effectiveColumnSpacing / 2.0; - } + final double paddingStart = switch (dataColumnIndex) { + 0 when displayCheckboxColumn && checkboxHorizontalMargin == null => effectiveHorizontalMargin / 2.0, + 0 => effectiveHorizontalMargin, + _ => effectiveColumnSpacing / 2.0, + }; final double paddingEnd; if (dataColumnIndex == columns.length - 1) { diff --git a/packages/flutter/lib/src/material/menu_anchor.dart b/packages/flutter/lib/src/material/menu_anchor.dart index ab05d34e717..38fe1e44ec3 100644 --- a/packages/flutter/lib/src/material/menu_anchor.dart +++ b/packages/flutter/lib/src/material/menu_anchor.dart @@ -2427,130 +2427,35 @@ class _MenuDirectionalFocusAction extends DirectionalFocusAction { return; } final bool buttonIsFocused = anchor.widget.childFocusNode?.hasPrimaryFocus ?? false; - Axis orientation; - if (buttonIsFocused && anchor._parent != null) { - orientation = anchor._parent!._orientation; - } else { - orientation = anchor._orientation; - } + final Axis? parentOrientation = anchor._parent?._orientation; + final Axis orientation = (buttonIsFocused ? parentOrientation : null) ?? anchor._orientation; + final bool differentParent = orientation != parentOrientation; final bool firstItemIsFocused = anchor._firstItemFocusNode?.hasPrimaryFocus ?? false; + final bool rtl = switch (Directionality.of(context)) { + TextDirection.rtl => true, + TextDirection.ltr => false, + }; + assert(_debugMenuInfo('In _MenuDirectionalFocusAction, current node is ${anchor.widget.childFocusNode?.debugLabel}, ' 'button is${buttonIsFocused ? '' : ' not'} focused. Assuming ${orientation.name} orientation.')); - switch (intent.direction) { - case TraversalDirection.up: - switch (orientation) { - case Axis.horizontal: - if (_moveToParent(anchor)) { - return; - } - case Axis.vertical: - if (firstItemIsFocused) { - if (_moveToParent(anchor)) { - return; - } - } - if (_moveToPrevious(anchor)) { - return; - } - } - case TraversalDirection.down: - switch (orientation) { - case Axis.horizontal: - if (_moveToSubmenu(anchor)) { - return; - } - case Axis.vertical: - if (_moveToNext(anchor)) { - return; - } - } - case TraversalDirection.left: - switch (orientation) { - case Axis.horizontal: - switch (Directionality.of(context)) { - case TextDirection.rtl: - if (_moveToNext(anchor)) { - return; - } - case TextDirection.ltr: - if (_moveToPrevious(anchor)) { - return; - } - } - case Axis.vertical: - switch (Directionality.of(context)) { - case TextDirection.rtl: - if (buttonIsFocused) { - if (_moveToSubmenu(anchor)) { - return; - } - } else { - if (_moveToNextFocusableTopLevel(anchor)) { - return; - } - } - case TextDirection.ltr: - switch (anchor._parent?._orientation) { - case Axis.horizontal: - case null: - if (_moveToPreviousFocusableTopLevel(anchor)) { - return; - } - case Axis.vertical: - if (buttonIsFocused) { - if (_moveToPreviousFocusableTopLevel(anchor)) { - return; - } - } else { - if (_moveToParent(anchor)) { - return; - } - } - } - } - } - case TraversalDirection.right: - switch (orientation) { - case Axis.horizontal: - switch (Directionality.of(context)) { - case TextDirection.rtl: - if (_moveToPrevious(anchor)) { - return; - } - case TextDirection.ltr: - if (_moveToNext(anchor)) { - return; - } - } - case Axis.vertical: - switch (Directionality.of(context)) { - case TextDirection.rtl: - switch (anchor._parent?._orientation) { - case Axis.horizontal: - case null: - if (_moveToPreviousFocusableTopLevel(anchor)) { - return; - } - case Axis.vertical: - if (_moveToParent(anchor)) { - return; - } - } - case TextDirection.ltr: - if (buttonIsFocused) { - if (_moveToSubmenu(anchor)) { - return; - } - } else { - if (_moveToNextFocusableTopLevel(anchor)) { - return; - } - } - } - } + final bool Function(_MenuAnchorState) traversal = switch ((intent.direction, orientation)) { + (TraversalDirection.up, Axis.horizontal) => _moveToParent, + (TraversalDirection.up, Axis.vertical) => firstItemIsFocused ? _moveToParent: _moveToPrevious, + (TraversalDirection.down, Axis.horizontal) => _moveToSubmenu, + (TraversalDirection.down, Axis.vertical) => _moveToNext, + (TraversalDirection.left, Axis.horizontal) => rtl ? _moveToNext : _moveToPrevious, + (TraversalDirection.right, Axis.horizontal) => rtl ? _moveToPrevious : _moveToNext, + (TraversalDirection.left, Axis.vertical) when rtl => buttonIsFocused ? _moveToSubmenu : _moveToNextFocusableTopLevel, + (TraversalDirection.left, Axis.vertical) when differentParent => _moveToPreviousFocusableTopLevel, + (TraversalDirection.left, Axis.vertical) => buttonIsFocused ? _moveToPreviousFocusableTopLevel : _moveToParent, + (TraversalDirection.right, Axis.vertical) when !rtl => buttonIsFocused ? _moveToSubmenu : _moveToNextFocusableTopLevel, + (TraversalDirection.right, Axis.vertical) when differentParent => _moveToPreviousFocusableTopLevel, + (TraversalDirection.right, Axis.vertical) => buttonIsFocused ? _moveToPreviousFocusableTopLevel : _moveToParent, + }; + if (!traversal(anchor)) { + super.invoke(intent); } - super.invoke(intent); } bool _moveToNext(_MenuAnchorState currentMenu) { diff --git a/packages/flutter/lib/src/material/reorderable_list.dart b/packages/flutter/lib/src/material/reorderable_list.dart index 6a928e0da80..2d5c95c11c2 100644 --- a/packages/flutter/lib/src/material/reorderable_list.dart +++ b/packages/flutter/lib/src/material/reorderable_list.dart @@ -393,39 +393,22 @@ class _ReorderableListViewState extends State { // If there is a header or footer we can't just apply the padding to the list, // so we break it up into padding for the header, footer and padding for the list. final EdgeInsets padding = widget.padding ?? EdgeInsets.zero; - late final EdgeInsets headerPadding; - late final EdgeInsets footerPadding; - late final EdgeInsets listPadding; - - if (widget.header == null && widget.footer == null) { - headerPadding = EdgeInsets.zero; - footerPadding = EdgeInsets.zero; - listPadding = padding; - } else if (widget.header != null || widget.footer != null) { - switch (widget.scrollDirection) { - case Axis.horizontal: - if (widget.reverse) { - headerPadding = EdgeInsets.fromLTRB(0, padding.top, padding.right, padding.bottom); - listPadding = EdgeInsets.fromLTRB(widget.footer != null ? 0 : padding.left, padding.top, widget.header != null ? 0 : padding.right, padding.bottom); - footerPadding = EdgeInsets.fromLTRB(padding.left, padding.top, 0, padding.bottom); - } else { - headerPadding = EdgeInsets.fromLTRB(padding.left, padding.top, 0, padding.bottom); - listPadding = EdgeInsets.fromLTRB(widget.header != null ? 0 : padding.left, padding.top, widget.footer != null ? 0 : padding.right, padding.bottom); - footerPadding = EdgeInsets.fromLTRB(0, padding.top, padding.right, padding.bottom); - } - case Axis.vertical: - if (widget.reverse) { - headerPadding = EdgeInsets.fromLTRB(padding.left, 0, padding.right, padding.bottom); - listPadding = EdgeInsets.fromLTRB(padding.left, widget.footer != null ? 0 : padding.top, padding.right, widget.header != null ? 0 : padding.bottom); - footerPadding = EdgeInsets.fromLTRB(padding.left, padding.top, padding.right, 0); - } else { - headerPadding = EdgeInsets.fromLTRB(padding.left, padding.top, padding.right, 0); - listPadding = EdgeInsets.fromLTRB(padding.left, widget.header != null ? 0 : padding.top, padding.right, widget.footer != null ? 0 : padding.bottom); - footerPadding = EdgeInsets.fromLTRB(padding.left, 0, padding.right, padding.bottom); - } - } + double? start = widget.header == null ? null : 0.0; + double? end = widget.footer == null ? null : 0.0; + if (widget.reverse) { + (start, end) = (end, start); } + final EdgeInsets startPadding, endPadding, listPadding; + (startPadding, endPadding, listPadding) = switch (widget.scrollDirection) { + Axis.horizontal || Axis.vertical when (start ?? end) == null => (EdgeInsets.zero, EdgeInsets.zero, padding), + Axis.horizontal => (padding.copyWith(left: 0), padding.copyWith(right: 0), padding.copyWith(left: start, right: end)), + Axis.vertical => (padding.copyWith(top: 0), padding.copyWith(bottom: 0), padding.copyWith(top: start, bottom: end)), + }; + final (EdgeInsets headerPadding, EdgeInsets footerPadding) = widget.reverse + ? (startPadding, endPadding) + : (endPadding, startPadding); + return CustomScrollView( scrollDirection: widget.scrollDirection, reverse: widget.reverse, diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart index d1e986e0324..923eb131f11 100644 --- a/packages/flutter/lib/src/material/slider.dart +++ b/packages/flutter/lib/src/material/slider.dart @@ -689,29 +689,16 @@ class _SliderState extends State with TickerProviderStateMixin { } void _actionHandler(_AdjustSliderIntent intent) { - final _RenderSlider renderSlider = _renderObjectKey.currentContext!.findRenderObject()! as _RenderSlider; - final TextDirection textDirection = Directionality.of(_renderObjectKey.currentContext!); + final TextDirection directionality = Directionality.of(_renderObjectKey.currentContext!); + final bool shouldIncrease = switch (intent.type) { + _SliderAdjustmentType.up => true, + _SliderAdjustmentType.down => false, + _SliderAdjustmentType.left => directionality == TextDirection.rtl, + _SliderAdjustmentType.right => directionality == TextDirection.ltr, + }; - switch (intent.type) { - case _SliderAdjustmentType.right: - switch (textDirection) { - case TextDirection.rtl: - renderSlider.decreaseAction(); - case TextDirection.ltr: - renderSlider.increaseAction(); - } - case _SliderAdjustmentType.left: - switch (textDirection) { - case TextDirection.rtl: - renderSlider.increaseAction(); - case TextDirection.ltr: - renderSlider.decreaseAction(); - } - case _SliderAdjustmentType.up: - renderSlider.increaseAction(); - case _SliderAdjustmentType.down: - renderSlider.decreaseAction(); - } + final _RenderSlider slider = _renderObjectKey.currentContext!.findRenderObject()! as _RenderSlider; + return shouldIncrease ? slider.increaseAction() : slider.decreaseAction(); } bool _focused = false; diff --git a/packages/flutter/lib/src/widgets/media_query.dart b/packages/flutter/lib/src/widgets/media_query.dart index 7333dceebd7..58a2bcf4440 100644 --- a/packages/flutter/lib/src/widgets/media_query.dart +++ b/packages/flutter/lib/src/widgets/media_query.dart @@ -1642,93 +1642,28 @@ class MediaQuery extends InheritedModel<_MediaQueryAspect> { @override bool updateShouldNotifyDependent(MediaQuery oldWidget, Set dependencies) { - for (final Object dependency in dependencies) { - if (dependency is _MediaQueryAspect) { - switch (dependency) { - case _MediaQueryAspect.size: - if (data.size != oldWidget.data.size) { - return true; - } - case _MediaQueryAspect.orientation: - if (data.orientation != oldWidget.data.orientation) { - return true; - } - case _MediaQueryAspect.devicePixelRatio: - if (data.devicePixelRatio != oldWidget.data.devicePixelRatio) { - return true; - } - case _MediaQueryAspect.textScaleFactor: - if (data.textScaleFactor != oldWidget.data.textScaleFactor) { - return true; - } - case _MediaQueryAspect.textScaler: - if (data.textScaler != oldWidget.data.textScaler) { - return true; - } - case _MediaQueryAspect.platformBrightness: - if (data.platformBrightness != oldWidget.data.platformBrightness) { - return true; - } - case _MediaQueryAspect.padding: - if (data.padding != oldWidget.data.padding) { - return true; - } - case _MediaQueryAspect.viewInsets: - if (data.viewInsets != oldWidget.data.viewInsets) { - return true; - } - case _MediaQueryAspect.systemGestureInsets: - if (data.systemGestureInsets != oldWidget.data.systemGestureInsets) { - return true; - } - case _MediaQueryAspect.viewPadding: - if (data.viewPadding != oldWidget.data.viewPadding) { - return true; - } - case _MediaQueryAspect.alwaysUse24HourFormat: - if (data.alwaysUse24HourFormat != oldWidget.data.alwaysUse24HourFormat) { - return true; - } - case _MediaQueryAspect.accessibleNavigation: - if (data.accessibleNavigation != oldWidget.data.accessibleNavigation) { - return true; - } - case _MediaQueryAspect.invertColors: - if (data.invertColors != oldWidget.data.invertColors) { - return true; - } - case _MediaQueryAspect.highContrast: - if (data.highContrast != oldWidget.data.highContrast) { - return true; - } - case _MediaQueryAspect.onOffSwitchLabels: - if (data.onOffSwitchLabels != oldWidget.data.onOffSwitchLabels) { - return true; - } - case _MediaQueryAspect.disableAnimations: - if (data.disableAnimations != oldWidget.data.disableAnimations) { - return true; - } - case _MediaQueryAspect.boldText: - if (data.boldText != oldWidget.data.boldText) { - return true; - } - case _MediaQueryAspect.navigationMode: - if (data.navigationMode != oldWidget.data.navigationMode) { - return true; - } - case _MediaQueryAspect.gestureSettings: - if (data.gestureSettings != oldWidget.data.gestureSettings) { - return true; - } - case _MediaQueryAspect.displayFeatures: - if (data.displayFeatures != oldWidget.data.displayFeatures) { - return true; - } - } - } - } - return false; + return dependencies.any((Object dependency) => dependency is _MediaQueryAspect && switch (dependency) { + _MediaQueryAspect.size => data.size != oldWidget.data.size, + _MediaQueryAspect.orientation => data.orientation != oldWidget.data.orientation, + _MediaQueryAspect.devicePixelRatio => data.devicePixelRatio != oldWidget.data.devicePixelRatio, + _MediaQueryAspect.textScaleFactor => data.textScaleFactor != oldWidget.data.textScaleFactor, + _MediaQueryAspect.textScaler => data.textScaler != oldWidget.data.textScaler, + _MediaQueryAspect.platformBrightness => data.platformBrightness != oldWidget.data.platformBrightness, + _MediaQueryAspect.padding => data.padding != oldWidget.data.padding, + _MediaQueryAspect.viewInsets => data.viewInsets != oldWidget.data.viewInsets, + _MediaQueryAspect.viewPadding => data.viewPadding != oldWidget.data.viewPadding, + _MediaQueryAspect.invertColors => data.invertColors != oldWidget.data.invertColors, + _MediaQueryAspect.highContrast => data.highContrast != oldWidget.data.highContrast, + _MediaQueryAspect.onOffSwitchLabels => data.onOffSwitchLabels != oldWidget.data.onOffSwitchLabels, + _MediaQueryAspect.disableAnimations => data.disableAnimations != oldWidget.data.disableAnimations, + _MediaQueryAspect.boldText => data.boldText != oldWidget.data.boldText, + _MediaQueryAspect.navigationMode => data.navigationMode != oldWidget.data.navigationMode, + _MediaQueryAspect.gestureSettings => data.gestureSettings != oldWidget.data.gestureSettings, + _MediaQueryAspect.displayFeatures => data.displayFeatures != oldWidget.data.displayFeatures, + _MediaQueryAspect.systemGestureInsets => data.systemGestureInsets != oldWidget.data.systemGestureInsets, + _MediaQueryAspect.accessibleNavigation => data.accessibleNavigation != oldWidget.data.accessibleNavigation, + _MediaQueryAspect.alwaysUse24HourFormat => data.alwaysUse24HourFormat != oldWidget.data.alwaysUse24HourFormat, + }); } }