-
Notifications
You must be signed in to change notification settings - Fork 29.8k
Implementing switch expressions [refactoring flutter/lib/src/]
#143496
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implementing switch expressions [refactoring flutter/lib/src/]
#143496
Conversation
| switch (textDirection!) { | ||
| case TextDirection.rtl: | ||
| return Offset(x - boxSize.width, (sizes.content - boxSize.height + sizes.densityAdjustment.dy) / 2.0); | ||
| x -= boxSize.width; | ||
| case TextDirection.ltr: | ||
| return Offset(x, (sizes.content - boxSize.height + sizes.densityAdjustment.dy) / 2.0); | ||
| break; | ||
| } | ||
| return Offset(x, (sizes.content - boxSize.height + sizes.densityAdjustment.dy) / 2.0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I didn't implement a switch expression here, but I did notice that the only difference between the two Offsets was that the rtl has a - boxSize.width. The way it's formatted now hopefully makes that easier to see.
| bool rightWayUp; | ||
| switch (constraints.axisDirection) { | ||
| case AxisDirection.up: | ||
| case AxisDirection.left: | ||
| rightWayUp = false; | ||
| case AxisDirection.down: | ||
| case AxisDirection.right: | ||
| rightWayUp = true; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
rightWayUp was set up to be true for AxisDirection.down & AxisDirection.right, and false otherwise.
But axisDirectionIsReversed() already does the same thing, just swapped.
| assert(child.parent == this); | ||
| assert(child is RenderSliver); | ||
| final RenderSliver sliver = child as RenderSliver; | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This code has a lot in common with the getOffsetToReveal() function that I'd refactored previously, so I made similar changes here.
| if (modifiers & (leftMask | rightMask | anyMask) == anyMask) { | ||
| // If only the "anyMask" bit is set, then we respond true for requests of | ||
| // whether either left or right is pressed. Handles the case where iOS | ||
| // supplies just the "either" modifier flag, but not the left/right flag. | ||
| // (e.g. modifierShift but not modifierLeftShift). | ||
| return true; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code was originally set up as follows:
switch (side) {
case KeyboardSide.any:
return true;
case KeyboardSide.all:
return [expression] || anyOnly;
case KeyboardSide.left:
return [other expression] || anyOnly;
case KeyboardSide.right:
return [other expression] || anyOnly;
}So if anyOnly was true, the function would return true no matter what. I think it's easier to follow when the function just returns true right away instead of creating a variable.
| final AxisDirection direction = switch (stretchDirection) { | ||
| _StretchDirection.trailing => widget.axisDirection, | ||
| _StretchDirection.leading => flipAxisDirection(widget.axisDirection), | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We can avoid all those conditional expressions by just flipping the direction beforehand based on the stretchDirection.
| if (axisDirectionToAxis(intent.direction) == axisDirectionToAxis(state.axisDirection)) { | ||
| final double increment = _calculateScrollIncrement(state, type: intent.type); | ||
| return intent.direction == state.axisDirection ? increment : -increment; | ||
| } | ||
| return 0.0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Saved the best for last! This function body has been reduced from 43 lines down to 5, and _calculateScrollIncrement() will no longer be called if it isn't needed.
switch expressions, episode 8: refactoring flutter/lib/src/switch expressions [refactoring flutter/lib/src/]
|
It looks like this pull request may not have tests. Please make sure to add tests before merging. If you need an exemption to this rule, contact "@test-exemption-reviewer" in the #hackers channel in Chat (don't just cc them here, they won't see it! Use Discord!). If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix? Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. |
| (true, false, true) => darkHighContrastColor, | ||
| (true, true, false) => darkElevatedColor, | ||
| (true, true, true) => darkHighContrastElevatedColor, | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I find this sea of false/true makes it harder to understand what is actually going on. Is there a better way to express this that preserve a little more context of what is false/true?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not a huge fan of the long CupertinoUserInterfaceLevelData name, but you have a good point that 3 bools in a row is difficult to follow. Hopefully it looks better now!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, this looks better. I wish Dart would support something similar to Swift where these could just be:
(.light, .base, false) => color,
goderbauer
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
| (true, false, true) => darkHighContrastColor, | ||
| (true, true, false) => darkElevatedColor, | ||
| (true, true, true) => darkHighContrastElevatedColor, | ||
| }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, this looks better. I wish Dart would support something similar to Swift where these could just be:
(.light, .base, false) => color,
| (drawerIsStart ? padding.right : padding.left); | ||
| } | ||
| } | ||
| final double dragAreaWidth = widget.edgeDragWidth ?? _kEdgeDragWidth + switch ((widget.alignment, Directionality.of(context))) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we break this up into multiple steps? This is a bit too busy in my opinion
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good! I made whitespace changes for readability; we could break it into multiple lines (but it would no longer be final and non-nullable):
double? dragAreaWidth = widget.edgeDragWidth;
dragAreaWidth ??= _kEdgeDragWidth + switch ((widget.alignment, Directionality.of(context))) {
(DrawerAlignment.start, TextDirection.ltr) => MediaQuery.paddingOf(context).left,
(DrawerAlignment.start, TextDirection.rtl) => MediaQuery.paddingOf(context).right,
(DrawerAlignment.end, TextDirection.rtl) => MediaQuery.paddingOf(context).left,
(DrawerAlignment.end, TextDirection.ltr) => MediaQuery.paddingOf(context).right,
};There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Gotcha. Feel free to keep it as is then :)
Roll Flutter from d7867ca to 064c340 (33 revisions) flutter/flutter@d7867ca...064c340 2024-02-19 engine-flutter-autoroll@skia.org Roll Flutter Engine from f71b7eee2266 to 714215d42e57 (1 revision) (flutter/flutter#143708) 2024-02-19 engine-flutter-autoroll@skia.org Roll Flutter Engine from 07c73b0c8413 to f71b7eee2266 (2 revisions) (flutter/flutter#143694) 2024-02-19 engine-flutter-autoroll@skia.org Roll Flutter Engine from 80d6745c6fd6 to 07c73b0c8413 (1 revision) (flutter/flutter#143682) 2024-02-19 engine-flutter-autoroll@skia.org Roll Flutter Engine from 67abf6eb36a1 to 80d6745c6fd6 (1 revision) (flutter/flutter#143676) 2024-02-18 engine-flutter-autoroll@skia.org Roll Flutter Engine from 8ae232196fc9 to 67abf6eb36a1 (1 revision) (flutter/flutter#143673) 2024-02-18 engine-flutter-autoroll@skia.org Roll Flutter Engine from f636f9635438 to 8ae232196fc9 (1 revision) (flutter/flutter#143659) 2024-02-18 ybz975218925@gmail.com Fixed the issue of incorrect item position when prototypeItem is set in SliverReorderableList. (flutter/flutter#142880) 2024-02-18 ybz975218925@gmail.com ShowCaretOnScreen is correctly scheduled within a SliverMainAxisGroup (flutter/flutter#141671) 2024-02-18 engine-flutter-autoroll@skia.org Roll Flutter Engine from 0ebd580cb8a7 to f636f9635438 (1 revision) (flutter/flutter#143657) 2024-02-17 engine-flutter-autoroll@skia.org Roll Flutter Engine from c807aeaab89c to 0ebd580cb8a7 (1 revision) (flutter/flutter#143655) 2024-02-17 engine-flutter-autoroll@skia.org Roll Flutter Engine from e51d4f1e285a to c807aeaab89c (4 revisions) (flutter/flutter#143652) 2024-02-17 jason-simmons@users.noreply.github.com Manual roll Packages from c56c12d to 0af905d (flutter/flutter#143651) 2024-02-17 jason-simmons@users.noreply.github.com Add an override annotation to the lineTerminator setter in the MemoryStdout fake class (flutter/flutter#143646) 2024-02-17 leroux_bruno@yahoo.fr InputDecorator M3 tests migration - Step3 (flutter/flutter#143520) 2024-02-17 leroux_bruno@yahoo.fr Update InputDecoration.contentPadding documentation (flutter/flutter#143519) 2024-02-17 jonahwilliams@google.com [Impeller] skip selectable text goldens for instability. (flutter/flutter#143627) 2024-02-17 engine-flutter-autoroll@skia.org Roll Flutter Engine from 2ed159a786ef to e51d4f1e285a (2 revisions) (flutter/flutter#143624) 2024-02-17 jonahwilliams@google.com [Impeller] skip perspective transformed text goldens. (flutter/flutter#143623) 2024-02-17 jonahwilliams@google.com [framework] Skip 5 failing framework tests. (flutter/flutter#143618) 2024-02-17 engine-flutter-autoroll@skia.org Roll Flutter Engine from afb270929a6c to 2ed159a786ef (1 revision) (flutter/flutter#143622) 2024-02-17 engine-flutter-autoroll@skia.org Roll Flutter Engine from c4fe6f01e0f5 to afb270929a6c (1 revision) (flutter/flutter#143619) 2024-02-16 bquinlan@google.com Implement `lineTerminator` in `MemoryStdout` Fake (flutter/flutter#143608) 2024-02-16 engine-flutter-autoroll@skia.org Roll Flutter Engine from 2eed3fbb293a to c4fe6f01e0f5 (3 revisions) (flutter/flutter#143615) 2024-02-16 31859944+LongCatIsLooong@users.noreply.github.com Don't paint the cursor for an invalid selection (flutter/flutter#143533) 2024-02-16 engine-flutter-autoroll@skia.org Roll Flutter Engine from 13dc857bf2ef to 2eed3fbb293a (2 revisions) (flutter/flutter#143609) 2024-02-16 goderbauer@google.com Fix implementation imports outside of lib (flutter/flutter#143594) 2024-02-16 andrewrkolos@gmail.com add parsing of assets transformer declarations in pubspec.yaml (flutter/flutter#143557) 2024-02-16 engine-flutter-autoroll@skia.org Roll Flutter Engine from 5fd5ccf32d08 to 13dc857bf2ef (6 revisions) (flutter/flutter#143607) 2024-02-16 goderbauer@google.com Fix SemanticsFinder for multi-view (flutter/flutter#143485) 2024-02-16 andrewrkolos@gmail.com rebuild the asset bundle if a file has been modified between `flutter test` runs (flutter/flutter#143569) 2024-02-16 pateltirth454@gmail.com Added Missing Field Name in Doc Comment in SnackBarThemeData (flutter/flutter#143588) 2024-02-16 nate.w5687@gmail.com Implementing `switch` expressions [refactoring `flutter/lib/src/`] (flutter/flutter#143496) 2024-02-16 engine-flutter-autoroll@skia.org Roll Flutter Engine from dd530f1556df to 5fd5ccf32d08 (3 revisions) (flutter/flutter#143593) If this roll has caused a breakage, revert this CL and stop the roller using the controls here: https://autoroll.skia.org/r/flutter-packages Please CC dit@google.com,rmistry@google.com,stuartmorgan@google.com on the revert to ensure that a human is aware of the problem. To file a bug in Packages: https://github.com/flutter/flutter/issues/new/choose To report a problem with the AutoRoller itself, please file a bug: https://issues.skia.org/issues/new?component=1389291&template=1850622 Documentation for the AutoRoller is here: ...
…143634) This PR is the 9áµ�ʰ step in the journey to solve issue #136139 and make the entire Flutter repo more readable. (previous pull requests: #139048, #139882, #141591, #142279, #142634, #142793, #143293, #143496) I did a pass through all of `packages/flutter/lib/src/` and found an abundance of `switch` statements to improve. Whereas #143496 focused on in-depth refactoring, this PR is full of simple, straightforward changes. (I ended up making some more complicated changes in `rendering/` and will file those separately after this PR is done.)
This pull request is part of the effort to solve issue #136139. The previous [`switch` expressions PR](#143496) was comprised of many simple changes throughout `flutter/lib/src/`, but due to some more in-depth refactoring in `flutter/lib/src/rendering/`, I decided to submit the changes to this directory as a separate pull request. There was really just one function that I changed significantly; I'll add a comment for explanation.
This PR is the 8ᵗʰ step in the journey to solve issue #136139 and make the entire Flutter repo more readable.
(previous pull requests: #139048, #139882, #141591, #142279, #142634, #142793, #143293)
I did a pass through all of
packages/flutter/lib/src/and found a whole bunch ofswitchstatements to improve: most of them were really simple, but many involved some thorough refactoring.This pull request is just the complicated stuff. 😎 I'll make comments to describe the changes, and then in the future there will be another PR (and it'll be much easier to review than this one).
Pre-launch Checklist
///).