Skip to content

Commit 0d50449

Browse files
committed
optimize self wrapContent calculate
1 parent 8455591 commit 0d50449

File tree

1 file changed

+37
-20
lines changed

1 file changed

+37
-20
lines changed

lib/src/constraint_layout.dart

Lines changed: 37 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)