@@ -184,6 +184,7 @@ extension WidgetsExt on Widget {
184
184
@_wrapperConstraint ConstraintId ? centerVerticalTo,
185
185
OnLayoutCallback ? callback,
186
186
double chainWeight = 1 ,
187
+ bool percentageTranslate = false ,
187
188
}) {
188
189
return Constrained (
189
190
key: key,
@@ -224,6 +225,7 @@ extension WidgetsExt on Widget {
224
225
centerVerticalTo: centerVerticalTo,
225
226
callback: callback,
226
227
chainWeight: chainWeight,
228
+ percentageTranslate: percentageTranslate,
227
229
),
228
230
child: this ,
229
231
);
@@ -262,7 +264,14 @@ bool _debugEnsureNotEmptyString(String name, String? value) {
262
264
263
265
bool _debugEnsurePercent (String name, double ? percent) {
264
266
if (percent == null || percent < 0 || percent > 1 ) {
265
- throw ConstraintLayoutException ('$name is between [0-1].' );
267
+ throw ConstraintLayoutException ('$name is between [0,1].' );
268
+ }
269
+ return true ;
270
+ }
271
+
272
+ bool _debugEnsureNegativePercent (String name, double ? percent) {
273
+ if (percent == null || percent < - 1 || percent > 1 ) {
274
+ throw ConstraintLayoutException ('$name is between [-1,1].' );
266
275
}
267
276
return true ;
268
277
}
@@ -455,6 +464,7 @@ class Constraint {
455
464
456
465
final OnLayoutCallback ? callback;
457
466
final double chainWeight;
467
+ final bool percentageTranslate;
458
468
459
469
Constraint ({
460
470
this .id,
@@ -493,6 +503,7 @@ class Constraint {
493
503
@_wrapperConstraint this .centerVerticalTo,
494
504
this .callback,
495
505
this .chainWeight = 1 ,
506
+ this .percentageTranslate = false ,
496
507
});
497
508
498
509
@override
@@ -534,7 +545,8 @@ class Constraint {
534
545
bottomRightTo == other.bottomRightTo &&
535
546
centerHorizontalTo == other.centerHorizontalTo &&
536
547
centerVerticalTo == other.centerVerticalTo &&
537
- callback == other.callback;
548
+ callback == other.callback &&
549
+ percentageTranslate == other.percentageTranslate;
538
550
539
551
@override
540
552
int get hashCode =>
@@ -572,7 +584,8 @@ class Constraint {
572
584
bottomRightTo.hashCode ^
573
585
centerHorizontalTo.hashCode ^
574
586
centerVerticalTo.hashCode ^
575
- callback.hashCode;
587
+ callback.hashCode ^
588
+ percentageTranslate.hashCode;
576
589
577
590
bool checkSize (double size) {
578
591
if (size == matchParent || size == wrapContent || size == matchConstraint) {
@@ -605,20 +618,26 @@ class Constraint {
605
618
assert (_debugEnsurePercent ('heightPercent' , heightPercent));
606
619
assert (_debugEnsurePercent ('horizontalBias' , horizontalBias));
607
620
assert (_debugEnsurePercent ('verticalBias' , verticalBias));
608
- assert (! percentageMargin || _debugEnsurePercent ('leftMargin' , margin.left));
609
- assert (! percentageMargin || _debugEnsurePercent ('topMargin' , margin.top));
610
- assert (
611
- ! percentageMargin || _debugEnsurePercent ('rightMargin' , margin.right));
612
621
assert (! percentageMargin ||
613
- _debugEnsurePercent ('bottomMargin' , margin.bottom));
622
+ _debugEnsureNegativePercent ('leftMargin' , margin.left));
623
+ assert (! percentageMargin ||
624
+ _debugEnsureNegativePercent ('topMargin' , margin.top));
625
+ assert (! percentageMargin ||
626
+ _debugEnsureNegativePercent ('rightMargin' , margin.right));
627
+ assert (! percentageMargin ||
628
+ _debugEnsureNegativePercent ('bottomMargin' , margin.bottom));
614
629
assert (! percentageMargin ||
615
- _debugEnsurePercent ('leftGoneMargin' , goneMargin.left));
630
+ _debugEnsureNegativePercent ('leftGoneMargin' , goneMargin.left));
616
631
assert (! percentageMargin ||
617
- _debugEnsurePercent ('topGoneMargin' , goneMargin.top));
632
+ _debugEnsureNegativePercent ('topGoneMargin' , goneMargin.top));
618
633
assert (! percentageMargin ||
619
- _debugEnsurePercent ('rightGoneMargin' , goneMargin.right));
634
+ _debugEnsureNegativePercent ('rightGoneMargin' , goneMargin.right));
620
635
assert (! percentageMargin ||
621
- _debugEnsurePercent ('bottomGoneMargin' , goneMargin.bottom));
636
+ _debugEnsureNegativePercent ('bottomGoneMargin' , goneMargin.bottom));
637
+ assert (! percentageTranslate ||
638
+ _debugEnsureNegativePercent ('xTranslate' , translate.dx));
639
+ assert (! percentageTranslate ||
640
+ _debugEnsureNegativePercent ('yTranslate' , translate.dy));
622
641
return true ;
623
642
}
624
643
@@ -849,6 +868,11 @@ class Constraint {
849
868
850
869
parentData.callback = callback;
851
870
871
+ if (parentData.percentageTranslate != percentageTranslate) {
872
+ parentData.percentageTranslate = percentageTranslate;
873
+ needsPaint = true ;
874
+ }
875
+
852
876
if (needsLayout) {
853
877
AbstractNode ? targetParent = renderObject.parent;
854
878
if (targetParent is RenderObject ) {
@@ -904,6 +928,7 @@ class _ConstraintBoxData extends ContainerBoxParentData<RenderBox> {
904
928
double ? horizontalBias;
905
929
double ? verticalBias;
906
930
OnLayoutCallback ? callback;
931
+ bool ? percentageTranslate;
907
932
908
933
// for internal use
909
934
late Map <ConstraintId , _ConstrainedNode > _tempConstrainedNodes;
@@ -2028,7 +2053,15 @@ class _ConstrainedNode {
2028
2053
}
2029
2054
}
2030
2055
2031
- Offset get translate => parentData.translate! ;
2056
+ Offset get translate {
2057
+ if (! percentageTranslate) {
2058
+ return parentData.translate! ;
2059
+ } else {
2060
+ double dx = renderBox! .size.width * parentData.translate! .dx;
2061
+ double dy = renderBox! .size.height * parentData.translate! .dy;
2062
+ return Offset (dx, dy);
2063
+ }
2064
+ }
2032
2065
2033
2066
bool get translateConstraint => parentData.translateConstraint! ;
2034
2067
@@ -2064,6 +2097,8 @@ class _ConstrainedNode {
2064
2097
2065
2098
BarrierDirection ? get direction => parentData._direction;
2066
2099
2100
+ bool get percentageTranslate => parentData.percentageTranslate! ;
2101
+
2067
2102
set offset (Offset value) {
2068
2103
parentData.offset = value;
2069
2104
}
@@ -2286,6 +2321,7 @@ class _InternalBox extends RenderBox {
2286
2321
constraintBoxData.callback = null ;
2287
2322
constraintBoxData._direction = null ;
2288
2323
constraintBoxData._referencedIds = null ;
2324
+ constraintBoxData.percentageTranslate = false ;
2289
2325
}
2290
2326
}
2291
2327
0 commit comments