5
5
import 'package:flutter/rendering.dart' ;
6
6
import 'package:flutter_test/flutter_test.dart' ;
7
7
8
+ import 'rendering_tester.dart' ;
9
+
8
10
class RenderTestBox extends RenderBox {
11
+ late Size boxSize;
12
+ int calls = 0 ;
9
13
double value = 0.0 ;
10
14
double next () {
11
15
value += 1.0 ;
@@ -19,9 +23,23 @@ class RenderTestBox extends RenderBox {
19
23
double computeMinIntrinsicHeight (double width) => next ();
20
24
@override
21
25
double computeMaxIntrinsicHeight (double width) => next ();
26
+
27
+ @override
28
+ void performLayout () {
29
+ size = constraints.biggest;
30
+ boxSize = size;
31
+ }
32
+
33
+ @override
34
+ double ? computeDistanceToActualBaseline (TextBaseline baseline) {
35
+ calls += 1 ;
36
+ return boxSize.height / 2.0 ;
37
+ }
22
38
}
23
39
24
40
void main () {
41
+ TestRenderingFlutterBinding .ensureInitialized ();
42
+
25
43
test ('Intrinsics cache' , () {
26
44
final RenderBox test = RenderTestBox ();
27
45
@@ -68,4 +86,52 @@ void main() {
68
86
expect (test.getMinIntrinsicWidth (0.0 ), equals (1.0 ));
69
87
70
88
});
89
+
90
+ // Regression test for https://github.com/flutter/flutter/issues/101179
91
+ test ('Cached baselines should be cleared if its parent re-layout' , () {
92
+ double viewHeight = 200.0 ;
93
+ final RenderTestBox test = RenderTestBox ();
94
+ final RenderBox baseline = RenderBaseline (
95
+ baseline: 0.0 ,
96
+ baselineType: TextBaseline .alphabetic,
97
+ child: test,
98
+ );
99
+ final RenderConstrainedBox root = RenderConstrainedBox (
100
+ additionalConstraints: BoxConstraints .tightFor (width: 200.0 , height: viewHeight),
101
+ child: baseline,
102
+ );
103
+
104
+ layout (RenderPositionedBox (
105
+ child: root,
106
+ ));
107
+
108
+ BoxParentData ? parentData = test.parentData as BoxParentData ? ;
109
+ expect (parentData! .offset.dy, - (viewHeight / 2.0 ));
110
+ expect (test.calls, 1 );
111
+
112
+ // Trigger the root render re-layout.
113
+ viewHeight = 300.0 ;
114
+ root.additionalConstraints = BoxConstraints .tightFor (width: 200.0 , height: viewHeight);
115
+ pumpFrame ();
116
+
117
+ parentData = test.parentData as BoxParentData ? ;
118
+ expect (parentData! .offset.dy, - (viewHeight / 2.0 ));
119
+ expect (test.calls, 2 ); // The layout constraints change will clear the cached data.
120
+
121
+ final RenderObject parent = test.parent! as RenderObject ;
122
+ expect (parent.debugNeedsLayout, false );
123
+
124
+ // Do not forget notify parent dirty after the cached data be cleared by `layout()`
125
+ test.markNeedsLayout ();
126
+ expect (parent.debugNeedsLayout, true );
127
+
128
+ pumpFrame ();
129
+ expect (parent.debugNeedsLayout, false );
130
+ expect (test.calls, 3 ); // Self dirty will clear the cached data.
131
+
132
+ parent.markNeedsLayout ();
133
+ pumpFrame ();
134
+
135
+ expect (test.calls, 3 ); // Use the cached data if the layout constraints do not change.
136
+ });
71
137
}
0 commit comments