@@ -145,6 +145,8 @@ class _ConstraintBoxData extends ContainerBoxParentData<RenderBox> {
145145 double ? horizontalBias;
146146 double ? verticalBias;
147147 int ? zIndex;
148+ Offset ? translate;
149+ bool ? translateDependency;
148150}
149151
150152class Constrained extends ParentDataWidget <_ConstraintBoxData > {
@@ -183,6 +185,8 @@ class Constrained extends ParentDataWidget<_ConstraintBoxData> {
183185 final bool ? centerVertical;
184186
185187 final int ? zIndex;
188+ final Offset ? translate;
189+ final bool ? translateDependency;
186190
187191 // TODO support chain
188192 // final ChainStyle? chainStyle;
@@ -219,6 +223,8 @@ class Constrained extends ParentDataWidget<_ConstraintBoxData> {
219223 this .horizontalBias,
220224 this .verticalBias,
221225 this .zIndex,
226+ this .translate,
227+ this .translateDependency,
222228 }) : super (
223229 key: key,
224230 child: child,
@@ -398,6 +404,19 @@ class Constrained extends ParentDataWidget<_ConstraintBoxData> {
398404 needsReorderChildren = true ;
399405 }
400406
407+ if (parentData.translateDependency != translateDependency) {
408+ parentData.translateDependency = translateDependency;
409+ needsLayout = true ;
410+ }
411+
412+ if (parentData.translate != translate) {
413+ parentData.translate = translate;
414+ if (parentData.translateDependency == true ) {
415+ needsLayout = true ;
416+ }
417+ needsPaint = true ;
418+ }
419+
401420 if (needsLayout) {
402421 AbstractNode ? targetParent = renderObject.parent;
403422 if (targetParent is RenderObject ) {
@@ -1205,31 +1224,39 @@ class _ConstraintRenderBox extends RenderBox
12051224 if (element.shouldNotPaint ()) {
12061225 continue ;
12071226 }
1227+
1228+ Offset clickShift = const Offset (0 , 0 );
1229+ if (element.translateDependency != true ) {
1230+ if (element.translate != null ) {
1231+ clickShift = element.translate! ;
1232+ }
1233+ }
1234+
12081235 // expand the click area without changing the actual size
12091236 Offset offsetPos = Offset (position.dx, position.dy);
12101237 EdgeInsets ? clickPadding = element.clickPadding;
12111238 if (clickPadding != null ) {
1212- double clickPaddingLeft = element.getX () - clickPadding.left;
1213- double clickPaddingTop = element.getY () - clickPadding.top;
1214- double clickPaddingRight = element.getX () +
1215- element.getMeasuredWidth (size) +
1216- clickPadding.right;
1217- double clickPaddingBottom = element.getY () +
1218- element.getMeasuredHeight (size) +
1219- clickPadding.bottom;
1239+ double x = element.getX ();
1240+ x += clickShift.dx;
1241+ double y = element.getY ();
1242+ y += clickShift.dy;
1243+ double clickPaddingLeft = x - clickPadding.left;
1244+ double clickPaddingTop = y - clickPadding.top;
1245+ double clickPaddingRight =
1246+ x + element.getMeasuredWidth (size) + clickPadding.right;
1247+ double clickPaddingBottom =
1248+ y + element.getMeasuredHeight (size) + clickPadding.bottom;
12201249 double xClickPercent = (offsetPos.dx - clickPaddingLeft) /
12211250 (clickPaddingRight - clickPaddingLeft);
12221251 double yClickPercent = (offsetPos.dy - clickPaddingTop) /
12231252 (clickPaddingBottom - clickPaddingTop);
1224- double realClickX =
1225- element.getX () + xClickPercent * element.getMeasuredWidth (size);
1226- double realClickY =
1227- element.getY () + yClickPercent * element.getMeasuredHeight (size);
1253+ double realClickX = x + xClickPercent * element.getMeasuredWidth (size);
1254+ double realClickY = y + yClickPercent * element.getMeasuredHeight (size);
12281255 offsetPos = Offset (realClickX, realClickY);
12291256 }
12301257
12311258 bool isHit = result.addWithPaintOffset (
1232- offset: element.offset,
1259+ offset: element.offset + clickShift ,
12331260 position: offsetPos,
12341261 hitTest: (BoxHitTestResult result, Offset transformed) {
12351262 return element.renderBox! .hitTest (result, position: transformed);
@@ -1274,7 +1301,15 @@ class _ConstraintRenderBox extends RenderBox
12741301 if (element.shouldNotPaint ()) {
12751302 continue ;
12761303 }
1277- context.paintChild (element.renderBox! , element.offset + offset);
1304+
1305+ Offset paintShift = const Offset (0 , 0 );
1306+ if (element.translateDependency != true ) {
1307+ if (element.translate != null ) {
1308+ paintShift = element.translate! ;
1309+ }
1310+ }
1311+ context.paintChild (
1312+ element.renderBox! , element.offset + offset + paintShift);
12781313 // draw child's click area
12791314 assert (() {
12801315 if (_debugShowClickArea == true ) {
@@ -1290,7 +1325,8 @@ class _ConstraintRenderBox extends RenderBox
12901325 element.getY () +
12911326 element.getMeasuredHeight (size) +
12921327 _getBottomInsets (clickPadding));
1293- context.canvas.drawRect (rect.shift (offset), paint);
1328+ rect = rect.shift (offset).shift (paintShift);
1329+ context.canvas.drawRect (rect, paint);
12941330 ui.ParagraphBuilder paragraphBuilder =
12951331 ui.ParagraphBuilder (ui.ParagraphStyle (
12961332 textAlign: TextAlign .center,
@@ -1299,15 +1335,10 @@ class _ConstraintRenderBox extends RenderBox
12991335 paragraphBuilder.addText ("CLICK AREA" );
13001336 ui.Paragraph paragraph = paragraphBuilder.build ();
13011337 paragraph.layout (ui.ParagraphConstraints (
1302- width: element. getMeasuredWidth (size) ,
1338+ width: rect.width ,
13031339 ));
13041340 context.canvas.drawParagraph (
1305- paragraph,
1306- (element.offset + offset) +
1307- Offset (
1308- 0 ,
1309- (element.getMeasuredHeight (size) - paragraph.height) /
1310- 2 ));
1341+ paragraph, rect.centerLeft + Offset (0 , - paragraph.height / 2 ));
13111342 }
13121343 return true ;
13131344 }());
@@ -1325,7 +1356,8 @@ class _ConstraintRenderBox extends RenderBox
13251356 paragraph.layout (ui.ParagraphConstraints (
13261357 width: element.getMeasuredWidth (size),
13271358 ));
1328- context.canvas.drawParagraph (paragraph, (element.offset + offset));
1359+ context.canvas
1360+ .drawParagraph (paragraph, element.offset + offset + paintShift);
13291361 }
13301362 return true ;
13311363 }());
@@ -1367,7 +1399,21 @@ class _NodeDependency {
13671399
13681400 int get zIndex => parentData.zIndex ?? index;
13691401
1370- Offset get offset => parentData.offset;
1402+ Offset get offset {
1403+ if (translate == null ) {
1404+ return parentData.offset;
1405+ } else {
1406+ if (translateDependency == true ) {
1407+ return parentData.offset + translate! ;
1408+ } else {
1409+ return parentData.offset;
1410+ }
1411+ }
1412+ }
1413+
1414+ Offset ? get translate => parentData.translate;
1415+
1416+ bool ? get translateDependency => parentData.translateDependency;
13711417
13721418 EdgeInsets ? get margin => parentData.margin;
13731419
0 commit comments