@@ -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