Skip to content

Commit 52c665d

Browse files
Revert "Do not rebuild Routes when a new opaque Route is pushed on top (#48900)" (#49366)
This reverts commit 8eecdbe.
1 parent a1fa1a3 commit 52c665d

File tree

7 files changed

+277
-702
lines changed

7 files changed

+277
-702
lines changed

packages/flutter/lib/src/rendering/stack.dart

Lines changed: 44 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -425,8 +425,7 @@ class RenderStack extends RenderBox
425425
}
426426
}
427427

428-
/// Helper function for calculating the intrinsics metrics of a Stack.
429-
static double getIntrinsicDimension(RenderBox firstChild, double mainChildSizeGetter(RenderBox child)) {
428+
double _getIntrinsicDimension(double mainChildSizeGetter(RenderBox child)) {
430429
double extent = 0.0;
431430
RenderBox child = firstChild;
432431
while (child != null) {
@@ -441,80 +440,29 @@ class RenderStack extends RenderBox
441440

442441
@override
443442
double computeMinIntrinsicWidth(double height) {
444-
return getIntrinsicDimension(firstChild, (RenderBox child) => child.getMinIntrinsicWidth(height));
443+
return _getIntrinsicDimension((RenderBox child) => child.getMinIntrinsicWidth(height));
445444
}
446445

447446
@override
448447
double computeMaxIntrinsicWidth(double height) {
449-
return getIntrinsicDimension(firstChild, (RenderBox child) => child.getMaxIntrinsicWidth(height));
448+
return _getIntrinsicDimension((RenderBox child) => child.getMaxIntrinsicWidth(height));
450449
}
451450

452451
@override
453452
double computeMinIntrinsicHeight(double width) {
454-
return getIntrinsicDimension(firstChild, (RenderBox child) => child.getMinIntrinsicHeight(width));
453+
return _getIntrinsicDimension((RenderBox child) => child.getMinIntrinsicHeight(width));
455454
}
456455

457456
@override
458457
double computeMaxIntrinsicHeight(double width) {
459-
return getIntrinsicDimension(firstChild, (RenderBox child) => child.getMaxIntrinsicHeight(width));
458+
return _getIntrinsicDimension((RenderBox child) => child.getMaxIntrinsicHeight(width));
460459
}
461460

462461
@override
463462
double computeDistanceToActualBaseline(TextBaseline baseline) {
464463
return defaultComputeDistanceToHighestActualBaseline(baseline);
465464
}
466465

467-
/// Lays out the positioned `child` according to `alignment` within a Stack of `size`.
468-
///
469-
/// Returns true when the child has visual overflow.
470-
static bool layoutPositionedChild(RenderBox child, StackParentData childParentData, Size size, Alignment alignment) {
471-
assert(childParentData.isPositioned);
472-
assert(child.parentData == childParentData);
473-
474-
bool hasVisualOverflow = false;
475-
BoxConstraints childConstraints = const BoxConstraints();
476-
477-
if (childParentData.left != null && childParentData.right != null)
478-
childConstraints = childConstraints.tighten(width: size.width - childParentData.right - childParentData.left);
479-
else if (childParentData.width != null)
480-
childConstraints = childConstraints.tighten(width: childParentData.width);
481-
482-
if (childParentData.top != null && childParentData.bottom != null)
483-
childConstraints = childConstraints.tighten(height: size.height - childParentData.bottom - childParentData.top);
484-
else if (childParentData.height != null)
485-
childConstraints = childConstraints.tighten(height: childParentData.height);
486-
487-
child.layout(childConstraints, parentUsesSize: true);
488-
489-
double x;
490-
if (childParentData.left != null) {
491-
x = childParentData.left;
492-
} else if (childParentData.right != null) {
493-
x = size.width - childParentData.right - child.size.width;
494-
} else {
495-
x = alignment.alongOffset(size - child.size as Offset).dx;
496-
}
497-
498-
if (x < 0.0 || x + child.size.width > size.width)
499-
hasVisualOverflow = true;
500-
501-
double y;
502-
if (childParentData.top != null) {
503-
y = childParentData.top;
504-
} else if (childParentData.bottom != null) {
505-
y = size.height - childParentData.bottom - child.size.height;
506-
} else {
507-
y = alignment.alongOffset(size - child.size as Offset).dy;
508-
}
509-
510-
if (y < 0.0 || y + child.size.height > size.height)
511-
hasVisualOverflow = true;
512-
513-
childParentData.offset = Offset(x, y);
514-
515-
return hasVisualOverflow;
516-
}
517-
518466
@override
519467
void performLayout() {
520468
_resolve();
@@ -579,7 +527,45 @@ class RenderStack extends RenderBox
579527
if (!childParentData.isPositioned) {
580528
childParentData.offset = _resolvedAlignment.alongOffset(size - child.size as Offset);
581529
} else {
582-
_hasVisualOverflow = layoutPositionedChild(child, childParentData, size, _resolvedAlignment) || _hasVisualOverflow;
530+
BoxConstraints childConstraints = const BoxConstraints();
531+
532+
if (childParentData.left != null && childParentData.right != null)
533+
childConstraints = childConstraints.tighten(width: size.width - childParentData.right - childParentData.left);
534+
else if (childParentData.width != null)
535+
childConstraints = childConstraints.tighten(width: childParentData.width);
536+
537+
if (childParentData.top != null && childParentData.bottom != null)
538+
childConstraints = childConstraints.tighten(height: size.height - childParentData.bottom - childParentData.top);
539+
else if (childParentData.height != null)
540+
childConstraints = childConstraints.tighten(height: childParentData.height);
541+
542+
child.layout(childConstraints, parentUsesSize: true);
543+
544+
double x;
545+
if (childParentData.left != null) {
546+
x = childParentData.left;
547+
} else if (childParentData.right != null) {
548+
x = size.width - childParentData.right - child.size.width;
549+
} else {
550+
x = _resolvedAlignment.alongOffset(size - child.size as Offset).dx;
551+
}
552+
553+
if (x < 0.0 || x + child.size.width > size.width)
554+
_hasVisualOverflow = true;
555+
556+
double y;
557+
if (childParentData.top != null) {
558+
y = childParentData.top;
559+
} else if (childParentData.bottom != null) {
560+
y = size.height - childParentData.bottom - child.size.height;
561+
} else {
562+
y = _resolvedAlignment.alongOffset(size - child.size as Offset).dy;
563+
}
564+
565+
if (y < 0.0 || y + child.size.height > size.height)
566+
_hasVisualOverflow = true;
567+
568+
childParentData.offset = Offset(x, y);
583569
}
584570

585571
assert(child.parentData == childParentData);

0 commit comments

Comments
 (0)