@@ -998,9 +998,26 @@ class PinnedPos {
998998 xOffset.hashCode ^ xType.hashCode ^ yOffset.hashCode ^ yType.hashCode;
999999}
10001000
1001+ class PinnedTranslate extends Offset {
1002+ PinnedInfo pinnedInfo;
1003+
1004+ PinnedTranslate (this .pinnedInfo) : super (0 , 0 );
1005+
1006+ @override
1007+ bool operator == (Object other) =>
1008+ identical (this , other) ||
1009+ super == other &&
1010+ other is PinnedTranslate &&
1011+ runtimeType == other.runtimeType &&
1012+ pinnedInfo == other.pinnedInfo;
1013+
1014+ @override
1015+ int get hashCode => super .hashCode ^ pinnedInfo.hashCode;
1016+ }
1017+
10011018class PinnedInfo {
10021019 /// [0,360]
1003- int rotateDegree ;
1020+ int angle ;
10041021 ConstraintId anchorId;
10051022 PinnedPos selfPos;
10061023 PinnedPos targetPos;
@@ -1009,22 +1026,22 @@ class PinnedInfo {
10091026 this .anchorId,
10101027 this .selfPos,
10111028 this .targetPos, {
1012- this .rotateDegree = 0 ,
1029+ this .angle = 0 ,
10131030 });
10141031
10151032 @override
10161033 bool operator == (Object other) =>
10171034 identical (this , other) ||
10181035 other is PinnedInfo &&
10191036 runtimeType == other.runtimeType &&
1020- rotateDegree == other.rotateDegree &&
1037+ angle == other.angle &&
10211038 anchorId == other.anchorId &&
10221039 selfPos == other.selfPos &&
10231040 targetPos == other.targetPos;
10241041
10251042 @override
10261043 int get hashCode =>
1027- rotateDegree .hashCode ^
1044+ angle .hashCode ^
10281045 anchorId.hashCode ^
10291046 selfPos.hashCode ^
10301047 targetPos.hashCode;
@@ -1920,14 +1937,42 @@ class Constraint extends ConstraintDefine {
19201937 needsLayout = true ;
19211938 }
19221939
1923- if (parentData.translate != translate) {
1924- parentData.translate = translate;
1925- if (translateConstraint) {
1926- needsLayout = true ;
1940+ if (parentData.translate.runtimeType != translate.runtimeType) {
1941+ needsRecalculateConstraints = true ;
1942+ needsLayout = true ;
1943+ } else {
1944+ if (translate.runtimeType == Offset ) {
1945+ if (parentData.translate != translate) {
1946+ if (translateConstraint) {
1947+ needsLayout = true ;
1948+ } else {
1949+ needsPaint = true ;
1950+ }
1951+ }
19271952 } else {
1928- needsPaint = true ;
1953+ PinnedInfo lastInfo =
1954+ (parentData.translate as PinnedTranslate ).pinnedInfo;
1955+ PinnedInfo currentInto = (translate as PinnedTranslate ).pinnedInfo;
1956+ if (lastInfo.anchorId == currentInto.anchorId) {
1957+ if (lastInfo.selfPos != currentInto.selfPos ||
1958+ lastInfo.targetPos != currentInto.targetPos) {
1959+ if (translateConstraint) {
1960+ needsLayout = true ;
1961+ } else {
1962+ needsPaint = true ;
1963+ }
1964+ } else {
1965+ if (lastInfo.angle != currentInto.angle) {
1966+ needsPaint = true ;
1967+ }
1968+ }
1969+ } else {
1970+ needsRecalculateConstraints = true ;
1971+ needsLayout = true ;
1972+ }
19291973 }
19301974 }
1975+ parentData.translate = translate;
19311976
19321977 if (parentData.widthPercent != widthPercent) {
19331978 parentData.widthPercent = widthPercent;
@@ -2010,8 +2055,7 @@ class Constraint extends ConstraintDefine {
20102055 } else if (parentData.pinnedInfo! .selfPos != pinnedInfo! .selfPos ||
20112056 parentData.pinnedInfo! .targetPos != pinnedInfo! .targetPos) {
20122057 needsLayout = true ;
2013- } else if (parentData.pinnedInfo! .rotateDegree !=
2014- pinnedInfo! .rotateDegree) {
2058+ } else if (parentData.pinnedInfo! .angle != pinnedInfo! .angle) {
20152059 needsPaint = true ;
20162060 }
20172061 }
@@ -2387,7 +2431,14 @@ class _ConstraintRenderBox extends RenderBox
23872431 }
23882432
23892433 set constraintVersion (ConstraintVersion ? value) {
2390- if (_constraintVersion == null || value == null ) {
2434+ if (_constraintVersion == null && value == null ) {
2435+ // do nothing
2436+ } else if (_constraintVersion == null ) {
2437+ _constraintVersion = value;
2438+ markNeedsRecalculateConstraints ();
2439+ markNeedsLayout ();
2440+ } else if (value == null ) {
2441+ _constraintVersion = value;
23912442 markNeedsRecalculateConstraints ();
23922443 markNeedsLayout ();
23932444 } else {
@@ -2410,9 +2461,9 @@ class _ConstraintRenderBox extends RenderBox
24102461 value._eventOrderVersion) {
24112462 needsReorderEventOrder = true ;
24122463 }
2464+ _constraintVersion = value;
24132465 }
24142466 }
2415- _constraintVersion = value;
24162467 }
24172468
24182469 @override
@@ -2478,6 +2529,10 @@ class _ConstraintRenderBox extends RenderBox
24782529 if (childParentData.pinnedInfo != null ) {
24792530 constraintsIdSet.add (childParentData.pinnedInfo! .anchorId);
24802531 }
2532+ if (childParentData.translate is PinnedTranslate ) {
2533+ constraintsIdSet.add (
2534+ (childParentData.translate as PinnedTranslate ).pinnedInfo.anchorId);
2535+ }
24812536 child = childParentData.nextSibling;
24822537 }
24832538
@@ -2760,6 +2815,12 @@ class _ConstraintRenderBox extends RenderBox
27602815 childParentData.pinnedInfo! .anchorId, childIndex);
27612816 }
27622817
2818+ if (childParentData.translate is PinnedTranslate ) {
2819+ currentNode.pinnedConstraint = _getConstrainedNodeForChild (
2820+ (childParentData.translate as PinnedTranslate ).pinnedInfo.anchorId,
2821+ childIndex);
2822+ }
2823+
27632824 child = childParentData.nextSibling;
27642825 }
27652826
@@ -3458,9 +3519,14 @@ class _ConstraintRenderBox extends RenderBox
34583519 }
34593520
34603521 Offset calculateChildOffset (_ConstrainedNode node) {
3522+ PinnedInfo ? pinnedInfo;
34613523 if (node.pinnedInfo != null ) {
3462- PinnedInfo pinnedInfo = node.pinnedInfo! ;
3463- Offset selfOffset = pinnedInfo.selfPos.resolve (node.renderBox! .size);
3524+ pinnedInfo = node.pinnedInfo! ;
3525+ } else if (node.translate is PinnedTranslate && node.translateConstraint) {
3526+ pinnedInfo = (node.translate as PinnedTranslate ).pinnedInfo;
3527+ }
3528+ if (pinnedInfo != null ) {
3529+ Offset selfOffset = pinnedInfo.selfPos.resolve (node.getSize ());
34643530 Offset targetOffset =
34653531 pinnedInfo.targetPos.resolve (node.pinnedConstraint! .getSize (this ));
34663532 double offsetX =
@@ -3674,6 +3740,12 @@ class _ConstraintRenderBox extends RenderBox
36743740 }
36753741 }
36763742
3743+ if (node.translateConstraint) {
3744+ Offset translate = node.translate;
3745+ offsetX += translate.dx;
3746+ offsetY += translate.dy;
3747+ }
3748+
36773749 return Offset (offsetX, offsetY);
36783750 }
36793751
@@ -3778,15 +3850,33 @@ class _ConstraintRenderBox extends RenderBox
37783850 paintShift = element.translate;
37793851 }
37803852
3853+ PinnedInfo ? pinnedInfo;
37813854 if (element.pinnedInfo != null ) {
3855+ pinnedInfo = element.pinnedInfo;
3856+ } else if (element.translate is PinnedTranslate ) {
3857+ pinnedInfo = (element.translate as PinnedTranslate ).pinnedInfo;
3858+ if (! element.translateConstraint) {
3859+ Offset selfOffset = pinnedInfo.selfPos.resolve (element.getSize ());
3860+ Offset targetOffset = pinnedInfo.targetPos
3861+ .resolve (element.pinnedConstraint! .getSize (this ));
3862+ double offsetX = element.pinnedConstraint! .getX () +
3863+ targetOffset.dx -
3864+ selfOffset.dx -
3865+ element.getX ();
3866+ double offsetY = element.pinnedConstraint! .getY () +
3867+ targetOffset.dy -
3868+ selfOffset.dy -
3869+ element.getY ();
3870+ paintShift = Offset (offsetX, offsetY);
3871+ }
3872+ }
3873+ if (pinnedInfo != null ) {
37823874 context.canvas.save ();
3783- Offset anchorOffset =
3784- element.pinnedInfo! .selfPos.resolve (element.getSize ());
3875+ Offset anchorOffset = pinnedInfo.selfPos.resolve (element.getSize ());
37853876 context.canvas.translate (
37863877 element.offset.dx + offset.dx + paintShift.dx + anchorOffset.dx,
37873878 element.offset.dy + offset.dy + paintShift.dy + anchorOffset.dy);
3788- context.canvas
3789- .rotate (pi + pi * (element.pinnedInfo! .rotateDegree / 180 ));
3879+ context.canvas.rotate (pi + pi * (pinnedInfo.angle / 180 ));
37903880 context.paintChild (
37913881 element.renderBox! ,
37923882 Offset (- element.getMeasuredWidth () + anchorOffset.dx,
@@ -4049,16 +4139,10 @@ class _ConstrainedNode {
40494139
40504140 bool laidOutLater = false ;
40514141
4052- Offset get offset {
4053- if (translateConstraint) {
4054- return parentData.offset + translate;
4055- } else {
4056- return parentData.offset;
4057- }
4058- }
4142+ Offset get offset => parentData.offset;
40594143
40604144 Offset get translate {
4061- if (! percentageTranslate) {
4145+ if (! percentageTranslate || parentData.translate is PinnedTranslate ) {
40624146 return parentData.translate! ;
40634147 } else {
40644148 double dx = renderBox! .size.width * parentData.translate! .dx;
0 commit comments