@@ -422,6 +422,7 @@ extension ConstrainedWidgetsExt on Widget {
422
422
double maxHeight = matchParent,
423
423
double ? widthHeightRatio,
424
424
bool ? ratioBaseOnWidth,
425
+ int ? eIndex,
425
426
}) {
426
427
return Constrained (
427
428
key: key,
@@ -485,6 +486,7 @@ extension ConstrainedWidgetsExt on Widget {
485
486
centerBottomLeftTo: centerBottomLeftTo,
486
487
centerBottomCenterTo: centerBottomCenterTo,
487
488
centerBottomRightTo: centerBottomRightTo,
489
+ eIndex: eIndex,
488
490
),
489
491
child: this ,
490
492
);
@@ -909,6 +911,8 @@ class Constraint extends ConstraintDefine {
909
911
/// to specify the ratioBaseOnWidth parameter. The default value of null means automatically decide
910
912
final bool ? ratioBaseOnWidth;
911
913
914
+ final int ? eIndex;
915
+
912
916
Constraint ({
913
917
ConstraintId ? id,
914
918
this .width = wrapContent,
@@ -969,6 +973,7 @@ class Constraint extends ConstraintDefine {
969
973
this .maxHeight = matchParent,
970
974
this .widthHeightRatio,
971
975
this .ratioBaseOnWidth,
976
+ this .eIndex,
972
977
}) : super (id);
973
978
974
979
@override
@@ -1033,7 +1038,8 @@ class Constraint extends ConstraintDefine {
1033
1038
minHeight == other.minHeight &&
1034
1039
maxHeight == other.maxHeight &&
1035
1040
widthHeightRatio == other.widthHeightRatio &&
1036
- ratioBaseOnWidth == other.ratioBaseOnWidth;
1041
+ ratioBaseOnWidth == other.ratioBaseOnWidth &&
1042
+ eIndex == other.eIndex;
1037
1043
1038
1044
@override
1039
1045
int get hashCode =>
@@ -1094,7 +1100,8 @@ class Constraint extends ConstraintDefine {
1094
1100
minHeight.hashCode ^
1095
1101
maxHeight.hashCode ^
1096
1102
widthHeightRatio.hashCode ^
1097
- ratioBaseOnWidth.hashCode;
1103
+ ratioBaseOnWidth.hashCode ^
1104
+ eIndex.hashCode;
1098
1105
1099
1106
bool checkSize (double size) {
1100
1107
if (size == matchParent || size == wrapContent || size == matchConstraint) {
@@ -1357,7 +1364,8 @@ class Constraint extends ConstraintDefine {
1357
1364
renderObject.parentData! as _ConstraintBoxData ;
1358
1365
bool needsLayout = false ;
1359
1366
bool needsPaint = false ;
1360
- bool needsReorderChildren = false ;
1367
+ bool needsReorderPaintingOrder = false ;
1368
+ bool needsReorderEventOrder = false ;
1361
1369
bool needsRecalculateConstraints = false ;
1362
1370
1363
1371
if (parentData.id != id) {
@@ -1463,7 +1471,8 @@ class Constraint extends ConstraintDefine {
1463
1471
1464
1472
if (parentData.zIndex != zIndex) {
1465
1473
parentData.zIndex = zIndex;
1466
- needsReorderChildren = true ;
1474
+ needsReorderPaintingOrder = true ;
1475
+ needsReorderEventOrder = true ;
1467
1476
needsPaint = true ;
1468
1477
}
1469
1478
@@ -1548,6 +1557,11 @@ class Constraint extends ConstraintDefine {
1548
1557
needsLayout = true ;
1549
1558
}
1550
1559
1560
+ if (parentData.eIndex != eIndex) {
1561
+ parentData.eIndex = eIndex;
1562
+ needsReorderEventOrder = true ;
1563
+ }
1564
+
1551
1565
if (needsLayout) {
1552
1566
AbstractNode ? targetParent = renderObject.parent;
1553
1567
if (needsRecalculateConstraints) {
@@ -1559,10 +1573,16 @@ class Constraint extends ConstraintDefine {
1559
1573
targetParent.markNeedsLayout ();
1560
1574
}
1561
1575
} else {
1562
- if (needsReorderChildren) {
1576
+ if (needsReorderPaintingOrder) {
1577
+ AbstractNode ? targetParent = renderObject.parent;
1578
+ if (targetParent is _ConstraintRenderBox ) {
1579
+ targetParent.needsReorderPaintingOrder = true ;
1580
+ }
1581
+ }
1582
+ if (needsReorderEventOrder) {
1563
1583
AbstractNode ? targetParent = renderObject.parent;
1564
1584
if (targetParent is _ConstraintRenderBox ) {
1565
- targetParent.needsReorderChildren = true ;
1585
+ targetParent.needsReorderEventOrder = true ;
1566
1586
}
1567
1587
}
1568
1588
if (needsPaint) {
@@ -1615,6 +1635,7 @@ class _ConstraintBoxData extends ContainerBoxParentData<RenderBox> {
1615
1635
double ? maxHeight;
1616
1636
double ? widthHeightRatio;
1617
1637
bool ? ratioBaseOnWidth;
1638
+ int ? eIndex;
1618
1639
1619
1640
// for internal use
1620
1641
late Map <ConstraintId , _ConstrainedNode > _constrainedNodeMap;
@@ -1721,7 +1742,8 @@ class _ConstraintRenderBox extends RenderBox
1721
1742
late double _height;
1722
1743
1723
1744
bool _needsRecalculateConstraints = true ;
1724
- bool _needsReorderChildren = true ;
1745
+ bool _needsReorderPaintingOrder = true ;
1746
+ bool _needsReorderEventOrder = true ;
1725
1747
int _buildNodeTreesCount = 0 ;
1726
1748
final Map <ConstraintId , _ConstrainedNode > _helperNodeMap = HashMap ();
1727
1749
@@ -1731,6 +1753,9 @@ class _ConstraintRenderBox extends RenderBox
1731
1753
/// For paint
1732
1754
late List <_ConstrainedNode > _paintingOrderList;
1733
1755
1756
+ /// For event dispatch
1757
+ late List <_ConstrainedNode > _eventOrderList;
1758
+
1734
1759
static const int maxTimeUsage = 20 ;
1735
1760
Queue <int > layoutTimeUsage = Queue ();
1736
1761
Queue <int > paintTimeUsage = Queue ();
@@ -1869,13 +1894,19 @@ class _ConstraintRenderBox extends RenderBox
1869
1894
}
1870
1895
}
1871
1896
1872
- set needsReorderChildren (bool value) {
1873
- if (_needsReorderChildren != value) {
1874
- _needsReorderChildren = value;
1897
+ set needsReorderPaintingOrder (bool value) {
1898
+ if (_needsReorderPaintingOrder != value) {
1899
+ _needsReorderPaintingOrder = value;
1875
1900
markNeedsPaint ();
1876
1901
}
1877
1902
}
1878
1903
1904
+ set needsReorderEventOrder (bool value) {
1905
+ if (_needsReorderEventOrder != value) {
1906
+ _needsReorderEventOrder = value;
1907
+ }
1908
+ }
1909
+
1879
1910
set width (double value) {
1880
1911
if (_width != value) {
1881
1912
_width = value;
@@ -2219,7 +2250,8 @@ class _ConstraintRenderBox extends RenderBox
2219
2250
2220
2251
void markNeedsRecalculateConstraints () {
2221
2252
_needsRecalculateConstraints = true ;
2222
- _needsReorderChildren = true ;
2253
+ _needsReorderPaintingOrder = true ;
2254
+ _needsReorderEventOrder = true ;
2223
2255
}
2224
2256
2225
2257
@override
@@ -2285,6 +2317,7 @@ class _ConstraintRenderBox extends RenderBox
2285
2317
/// Sort by the depth of constraint from shallow to deep, the lowest depth is 0, representing parent
2286
2318
_layoutOrderList = nodesMap.values.toList ();
2287
2319
_paintingOrderList = nodesMap.values.toList ();
2320
+ _eventOrderList = nodesMap.values.toList ();
2288
2321
2289
2322
_layoutOrderList.sort ((left, right) {
2290
2323
return left.getDepth () - right.getDepth ();
@@ -2298,6 +2331,14 @@ class _ConstraintRenderBox extends RenderBox
2298
2331
return result;
2299
2332
});
2300
2333
2334
+ _eventOrderList.sort ((left, right) {
2335
+ int result = right.eIndex - left.eIndex;
2336
+ if (result == 0 ) {
2337
+ result = right.index - left.index;
2338
+ }
2339
+ return result;
2340
+ });
2341
+
2301
2342
assert (() {
2302
2343
/// Print constraints
2303
2344
if (_debugPrintConstraints) {
@@ -2309,7 +2350,8 @@ class _ConstraintRenderBox extends RenderBox
2309
2350
}());
2310
2351
2311
2352
_needsRecalculateConstraints = false ;
2312
- _needsReorderChildren = false ;
2353
+ _needsReorderPaintingOrder = false ;
2354
+ _needsReorderEventOrder = false ;
2313
2355
}
2314
2356
2315
2357
_layoutByConstrainedNodeTrees ();
@@ -2848,7 +2890,18 @@ class _ConstraintRenderBox extends RenderBox
2848
2890
BoxHitTestResult result, {
2849
2891
required Offset position,
2850
2892
}) {
2851
- for (final element in _paintingOrderList.reversed) {
2893
+ if (_needsReorderEventOrder) {
2894
+ _eventOrderList.sort ((left, right) {
2895
+ int result = right.eIndex - left.eIndex;
2896
+ if (result == 0 ) {
2897
+ result = right.index - left.index;
2898
+ }
2899
+ return result;
2900
+ });
2901
+ _needsReorderEventOrder = false ;
2902
+ }
2903
+
2904
+ for (final element in _eventOrderList) {
2852
2905
if (element.shouldNotPaint ()) {
2853
2906
continue ;
2854
2907
}
@@ -2912,15 +2965,15 @@ class _ConstraintRenderBox extends RenderBox
2912
2965
return true ;
2913
2966
}());
2914
2967
2915
- if (_needsReorderChildren ) {
2968
+ if (_needsReorderPaintingOrder ) {
2916
2969
_paintingOrderList.sort ((left, right) {
2917
2970
int result = left.zIndex - right.zIndex;
2918
2971
if (result == 0 ) {
2919
2972
result = left.index - right.index;
2920
2973
}
2921
2974
return result;
2922
2975
});
2923
- _needsReorderChildren = false ;
2976
+ _needsReorderPaintingOrder = false ;
2924
2977
}
2925
2978
2926
2979
for (final element in _paintingOrderList) {
@@ -3147,6 +3200,8 @@ class _ConstrainedNode {
3147
3200
3148
3201
int get zIndex => parentData.zIndex ?? index;
3149
3202
3203
+ int get eIndex => parentData.eIndex ?? zIndex;
3204
+
3150
3205
Offset get offset {
3151
3206
if (translateConstraint) {
3152
3207
return parentData.offset + translate;
@@ -3459,6 +3514,7 @@ class _HelperBox extends RenderBox {
3459
3514
constraintBoxData.maxHeight = matchParent;
3460
3515
constraintBoxData.widthHeightRatio = null ;
3461
3516
constraintBoxData.ratioBaseOnWidth = null ;
3517
+ constraintBoxData.eIndex = null ;
3462
3518
constraintBoxData._direction = null ;
3463
3519
constraintBoxData._referencedIds = null ;
3464
3520
constraintBoxData._isGuideline = false ;
0 commit comments