@@ -2253,11 +2253,11 @@ class _ConstraintRenderBox extends RenderBox
22532253 }
22542254
22552255 /// There should be no loop constraints
2256- static void _debugCheckLoopConstraints (
2257- List < _ConstrainedNode > nodeList, bool selfSizeConfirmed ) {
2256+ static void _debugCheckLoopConstraints (List < _ConstrainedNode > nodeList,
2257+ bool selfSizeConfirmed, double resolvedWidth, double resolvedHeight ) {
22582258 for (final element in nodeList) {
22592259 try {
2260- element.getDepth (selfSizeConfirmed);
2260+ element.getDepth (selfSizeConfirmed, resolvedWidth, resolvedHeight );
22612261 } on StackOverflowError catch (_) {
22622262 throw ConstraintLayoutException (
22632263 'There are some loop constraints, please check the code. For layout performance considerations, constraints are always one-way, and there should be no two child elements directly or indirectly restrain each other. Each constraint should describe exactly where the child elements are located. Use Guideline to break loop constraints.' );
@@ -2566,6 +2566,10 @@ class _ConstraintRenderBox extends RenderBox
25662566 if (resolvedWidth != wrapContent && resolvedHeight != wrapContent) {
25672567 size = Size (resolvedWidth, resolvedHeight);
25682568 selfSizeConfirmed = true ;
2569+ } else if (resolvedWidth != wrapContent) {
2570+ size = Size (resolvedWidth, constraints.minHeight);
2571+ } else if (resolvedHeight != wrapContent) {
2572+ size = Size (constraints.minWidth, resolvedHeight);
25692573 }
25702574
25712575 if (_needsRecalculateConstraints) {
@@ -2585,7 +2589,8 @@ class _ConstraintRenderBox extends RenderBox
25852589 if (_debugCheckConstraints) {
25862590 List <_ConstrainedNode > nodeList = nodesMap.values.toList ();
25872591 _debugCheckConstraintsIntegrity (nodeList);
2588- _debugCheckLoopConstraints (nodeList, selfSizeConfirmed);
2592+ _debugCheckLoopConstraints (
2593+ nodeList, selfSizeConfirmed, resolvedWidth, resolvedHeight);
25892594 }
25902595 return true ;
25912596 }());
@@ -2596,8 +2601,8 @@ class _ConstraintRenderBox extends RenderBox
25962601 _layoutOrderList.add (parentNode! );
25972602 }
25982603 _layoutOrderList.sort ((left, right) {
2599- return left.getDepth (selfSizeConfirmed) -
2600- right.getDepth (selfSizeConfirmed);
2604+ return left.getDepth (selfSizeConfirmed, resolvedWidth, resolvedHeight ) -
2605+ right.getDepth (selfSizeConfirmed, resolvedWidth, resolvedHeight );
26012606 });
26022607
26032608 _paintingOrderList = nodesMap.values.toList ();
@@ -3504,7 +3509,8 @@ class _ConstraintRenderBox extends RenderBox
35043509 paragraphBuilder.pushStyle (ui.TextStyle (
35053510 color: Colors .black,
35063511 ));
3507- paragraphBuilder.addText ("depth ${element .getDepth (null )}" );
3512+ paragraphBuilder
3513+ .addText ("depth ${element .getDepth (null , null , null )}" );
35083514 ui.Paragraph paragraph = paragraphBuilder.build ();
35093515 paragraph.layout (ui.ParagraphConstraints (
35103516 width: element.getMeasuredWidth (),
@@ -3824,40 +3830,51 @@ class _ConstrainedNode {
38243830 return baseline;
38253831 }
38263832
3827- int getDepthFor (
3828- _ConstrainedNode ? constrainedNode, bool ? parentSizeConfirmed ) {
3833+ int getDepthFor (_ConstrainedNode ? constrainedNode, bool ? parentSizeConfirmed,
3834+ double ? resolvedWidth, double ? resolvedHeight ) {
38293835 if (constrainedNode == null ) {
38303836 return - 1 ;
38313837 }
38323838 if (parentSizeConfirmed == false ) {
38333839 if (constrainedNode.isParent ()) {
38343840 /// The width and height can be calculated directly without relying on parent
3835- if ((width >= 0 || width == wrapContent) &&
3836- (height >= 0 || height == wrapContent)) {
3841+ if ((width >= 0 ||
3842+ width == wrapContent ||
3843+ (width == matchParent && resolvedWidth != wrapContent)) &&
3844+ (height >= 0 ||
3845+ height == wrapContent ||
3846+ (height == matchParent && resolvedHeight != wrapContent))) {
38373847 return 0 ;
38383848 }
38393849 }
38403850 }
3841- return constrainedNode.getDepth (parentSizeConfirmed);
3851+ return constrainedNode.getDepth (
3852+ parentSizeConfirmed, resolvedWidth, resolvedHeight);
38423853 }
38433854
3844- int getDepth (bool ? parentSizeConfirmed) {
3855+ int getDepth (bool ? parentSizeConfirmed, double ? resolvedWidth,
3856+ double ? resolvedHeight) {
38453857 if (depth < 0 ) {
38463858 if (isBarrier) {
38473859 List <int > list = [];
38483860 for (final id in referencedIds! ) {
38493861 list.add (parentData._constrainedNodeMap[id]!
3850- .getDepth (parentSizeConfirmed));
3862+ .getDepth (parentSizeConfirmed, resolvedWidth, resolvedHeight ));
38513863 }
38523864 list.sort ((left, right) => left - right);
38533865 depth = list.last + 1 ;
38543866 } else {
38553867 List <int > list = [
3856- getDepthFor (leftConstraint, parentSizeConfirmed),
3857- getDepthFor (topConstraint, parentSizeConfirmed),
3858- getDepthFor (rightConstraint, parentSizeConfirmed),
3859- getDepthFor (bottomConstraint, parentSizeConfirmed),
3860- getDepthFor (baselineConstraint, parentSizeConfirmed),
3868+ getDepthFor (leftConstraint, parentSizeConfirmed, resolvedWidth,
3869+ resolvedHeight),
3870+ getDepthFor (topConstraint, parentSizeConfirmed, resolvedWidth,
3871+ resolvedHeight),
3872+ getDepthFor (rightConstraint, parentSizeConfirmed, resolvedWidth,
3873+ resolvedHeight),
3874+ getDepthFor (bottomConstraint, parentSizeConfirmed, resolvedWidth,
3875+ resolvedHeight),
3876+ getDepthFor (baselineConstraint, parentSizeConfirmed, resolvedWidth,
3877+ resolvedHeight),
38613878 ];
38623879 list.sort ((left, right) => left - right);
38633880 depth = list.last + 1 ;
@@ -3936,7 +3953,7 @@ class _ConstrainedNode {
39363953 }
39373954 }
39383955 }
3939- map['depth' ] = getDepth (null );
3956+ map['depth' ] = getDepth (null , null , null );
39403957 return map;
39413958 }
39423959}
0 commit comments