-
Notifications
You must be signed in to change notification settings - Fork 26.9k
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
Make FittedBox
not throw when child has zero size.
#150430
Conversation
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.
Thank you for the fix and sorry for the delay in reviewing it.
case BoxFit.none: | ||
size = constraints.constrainSizeAndAttemptToPreserveAspectRatio(child!.size); | ||
if (child!.size.isEmpty) { | ||
size = constraints.biggest; |
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.
Our default is usually constraints.smallest
for these cases (see also the else branch bellow). Was there a good reason to use biggest here? Or should this also be smallest?
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.
My bad, it should be constraints.smallest
there. I made some mistakes in previous testing and thought the default behaviour of FittedBox
is constraints.biggest
.
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've changed it to smallest. And I updated computeDryLayout
to match performLayout
since I forgot about computeDryLayout
perviously.
change fitted box default size to constraint.smallest and match computeDryLayout to performLayout
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!
case BoxFit.none: | ||
size = constraints.constrainSizeAndAttemptToPreserveAspectRatio(child!.size); | ||
if (child!.size.isEmpty) { | ||
size = constraints.smallest; |
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 assertion was in BoxConstraints.constrainSizeAndAttemptToPreserveAspectRatio
. I think we should try to fix that method so it can handle an empty size as input?
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 am not sure how it should behave when only one side of the target size is 0. For example if height
is finite while width
is 0, Do you think BoxConstraints.constrainSizeAndAttemptToPreserveAspectRatio
should trying to match the height(only constrain size and ignored the aspect ratio), or return constraints.smallest
regardless(treat any zero size as empty)?
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 I think in your example the method should return constrainSize(inputSize)
, instead of returning smallest
and ignoring the input size.
The reason for that is I think returning smallest
when the child size is empty feels like a special case, one that feels a bit artificial (if we do that then the documentation needs to be updated).
Say the input BoxConstraints
is loose and unbounded (i.e., BoxConstraints()
), then RenderFittedBox
always takes the same size as its child when the child size is not empty, so ideally we don't have the special case it when the child size is empty, and always return the child size regardless if it's empty.
remove guard in RenderFittedBox.computeDryLayout since zero size child is now valid.
@goderbauer would you like to take another look and see if the updated version makes sense to you? |
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.
Still LGTM
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.
Thank you for contributing!
flutter/flutter@fafd67d...5103d75 2024-07-09 [email protected] [tool] Remove some usages of deprecated usage package (flutter/flutter#151359) 2024-07-09 43759233 [email protected] Write the package config location to the test bootstrap. (flutter/flutter#150440) 2024-07-09 [email protected] [deps] Roll dart-lang/native packages (flutter/flutter#151403) 2024-07-08 [email protected] [tool] make `testUsingContext` provide a `Stdio` (with `hasTerminal` unset) override by default (flutter/flutter#151357) 2024-07-08 120297255 [email protected] Make `FittedBox` not throw when child has zero size. (flutter/flutter#150430) 2024-07-08 [email protected] Update `DataTable` documentation (flutter/flutter#151356) 2024-07-08 [email protected] `MaterialState` � `WidgetState` in documentation (flutter/flutter#151376) 2024-07-08 41930132 [email protected] [ios]A typical news app benchmark with bottom ad banner (flutter/flutter#150991) 2024-07-08 [email protected] Re-enable `SemanticsAction.focus` matchers (flutter/flutter#150990) 2024-07-08 [email protected] Added SliverFloatingHeader.snapMode (flutter/flutter#151289) 2024-07-08 [email protected] Factor out deprecated names in example code (flutter/flutter#151374) 2024-07-08 [email protected] Add cedric vanden bosch to authors (flutter/flutter#151313) 2024-07-08 [email protected] Roll Packages from 97bad7e to 14341d1 (5 revisions) (flutter/flutter#151417) 2024-07-08 [email protected] Update doc-import to primary configured import, _goldens_io.dart (flutter/flutter#151390) 2024-07-08 [email protected] [Reland] - Enable `explicitChildNodes` for the `AlertDialog` content (flutter/flutter#149597) 2024-07-08 32538273 [email protected] Add tests for material_state_border_side.0_test.dart (flutter/flutter#151089) 2024-07-08 [email protected] Roll Flutter Engine from ca79a56a66d7 to 69075e7e87d4 (1 revision) (flutter/flutter#151393) 2024-07-08 32538273 [email protected] Add tests for action_listener.0.dart (flutter/flutter#150606) 2024-07-07 [email protected] Roll Flutter Engine from 5ca3b856ee5a to ca79a56a66d7 (1 revision) (flutter/flutter#151387) 2024-07-06 [email protected] Roll Flutter Engine from 3600ec613a00 to 5ca3b856ee5a (1 revision) (flutter/flutter#151378) 2024-07-06 [email protected] Roll Flutter Engine from d1ebc5fde630 to 3600ec613a00 (1 revision) (flutter/flutter#151377) 2024-07-06 [email protected] Roll Flutter Engine from e6b09697df1a to d1ebc5fde630 (1 revision) (flutter/flutter#151362) 2024-07-05 49699333 dependabot[bot]@users.noreply.github.com Bump actions/upload-artifact from 4.3.3 to 4.3.4 (flutter/flutter#151354) 2024-07-05 [email protected] Roll Flutter Engine from 4ee09d3b7f3b to e6b09697df1a (2 revisions) (flutter/flutter#151352) 2024-07-05 [email protected] Add tests for color_filtered.0.dart example. (flutter/flutter#151064) 2024-07-05 [email protected] de-duplicate code in analyze.dart (flutter/flutter#151279) 2024-07-05 [email protected] Roll Packages from 754de19 to 97bad7e (1 revision) (flutter/flutter#151350) 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 [email protected],[email protected],[email protected] 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: https://skia.googlesource.com/buildbot/ doc/main/autoroll/README.md
fix #135082 , fix #139539 , fix #142910
Before,
FittedBox
would throw when child size is zero, unless the constraint is tight and fit is notBoxFit.scaleDown
.Pre-launch Checklist
///
).