55import 'package:flutter/rendering.dart' ;
66import 'package:flutter_test/flutter_test.dart' ;
77
8+ import 'rendering_tester.dart' ;
9+
810class RenderTestBox extends RenderBox {
11+ late Size boxSize;
12+ int calls = 0 ;
913 double value = 0.0 ;
1014 double next () {
1115 value += 1.0 ;
@@ -19,9 +23,23 @@ class RenderTestBox extends RenderBox {
1923 double computeMinIntrinsicHeight (double width) => next ();
2024 @override
2125 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+ }
2238}
2339
2440void main () {
41+ TestRenderingFlutterBinding .ensureInitialized ();
42+
2543 test ('Intrinsics cache' , () {
2644 final RenderBox test = RenderTestBox ();
2745
@@ -68,4 +86,52 @@ void main() {
6886 expect (test.getMinIntrinsicWidth (0.0 ), equals (1.0 ));
6987
7088 });
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+ });
71137}
0 commit comments