From 48f08e3db23f14e41051d672ed3da1bc65caa87d Mon Sep 17 00:00:00 2001 From: Ian Hickson Date: Wed, 26 Jul 2023 22:59:17 -0700 Subject: [PATCH] IgnoreBaseline widget (#131220) Fixes https://github.com/flutter/flutter/issues/7037 --- packages/flutter/lib/src/rendering/flex.dart | 2 +- .../flutter/lib/src/rendering/proxy_box.dart | 13 +++++ packages/flutter/lib/src/widgets/basic.dart | 22 +++++++- .../flutter/test/rendering/baseline_test.dart | 52 +++++++++++++++++ packages/flutter/test/widgets/basic_test.dart | 56 +++++++++++++++++++ 5 files changed, 142 insertions(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/rendering/flex.dart b/packages/flutter/lib/src/rendering/flex.dart index db6df87572..5737ce92a1 100644 --- a/packages/flutter/lib/src/rendering/flex.dart +++ b/packages/flutter/lib/src/rendering/flex.dart @@ -916,7 +916,7 @@ class RenderFlex extends RenderBox with ContainerRenderObjectMixin[ + a = RenderParagraph( + const TextSpan(text: 'a', style: TextStyle(fontSize: 128.0, fontFamily: 'FlutterTest')), // places baseline at y=96 + textDirection: TextDirection.ltr, + ), + b = RenderParagraph( + const TextSpan(text: 'b', style: TextStyle(fontSize: 32.0, fontFamily: 'FlutterTest')), // 24 above baseline, 8 below baseline + textDirection: TextDirection.ltr, + ), + ], + ); + layout(root); + + final Offset aPos = a.localToGlobal(Offset.zero); + final Offset bPos = b.localToGlobal(Offset.zero); + expect(aPos.dy, 0.0); + expect(bPos.dy, 96.0 - 24.0); + }); + + test('RenderFlex and RenderIgnoreBaseline (with ignored baseline)', () { + final RenderBox a, b; + final RenderBox root = RenderFlex( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + textDirection: TextDirection.ltr, + children: [ + RenderIgnoreBaseline( + child: a = RenderParagraph( + const TextSpan(text: 'a', style: TextStyle(fontSize: 128.0, fontFamily: 'FlutterTest')), + textDirection: TextDirection.ltr, + ), + ), + b = RenderParagraph( + const TextSpan(text: 'b', style: TextStyle(fontSize: 32.0, fontFamily: 'FlutterTest')), + textDirection: TextDirection.ltr, + ), + ], + ); + layout(root); + + final Offset aPos = a.localToGlobal(Offset.zero); + final Offset bPos = b.localToGlobal(Offset.zero); + expect(aPos.dy, 0.0); + expect(bPos.dy, 0.0); + }); } diff --git a/packages/flutter/test/widgets/basic_test.dart b/packages/flutter/test/widgets/basic_test.dart index 5fb6bc82ef..86782c7700 100644 --- a/packages/flutter/test/widgets/basic_test.dart +++ b/packages/flutter/test/widgets/basic_test.dart @@ -1135,6 +1135,62 @@ void main() { contains('verticalDirection: up'), ])); }); + + testWidgets('Row and IgnoreBaseline (control -- with baseline)', (WidgetTester tester) async { + await tester.pumpWidget( + const Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + textDirection: TextDirection.ltr, + children: [ + Text( + 'a', + textDirection: TextDirection.ltr, + style: TextStyle(fontSize: 128.0, fontFamily: 'FlutterTest'), // places baseline at y=96 + ), + Text( + 'b', + textDirection: TextDirection.ltr, + style: TextStyle(fontSize: 32.0, fontFamily: 'FlutterTest'), // 24 above baseline, 8 below baseline + ), + ], + ), + ); + + final Offset aPos = tester.getTopLeft(find.text('a')); + final Offset bPos = tester.getTopLeft(find.text('b')); + expect(aPos.dy, 0.0); + expect(bPos.dy, 96.0 - 24.0); + }); + + testWidgets('Row and IgnoreBaseline (with ignored baseline)', (WidgetTester tester) async { + await tester.pumpWidget( + const Row( + crossAxisAlignment: CrossAxisAlignment.baseline, + textBaseline: TextBaseline.alphabetic, + textDirection: TextDirection.ltr, + children: [ + IgnoreBaseline( + child: Text( + 'a', + textDirection: TextDirection.ltr, + style: TextStyle(fontSize: 128.0, fontFamily: 'FlutterTest'), // places baseline at y=96 + ), + ), + Text( + 'b', + textDirection: TextDirection.ltr, + style: TextStyle(fontSize: 32.0, fontFamily: 'FlutterTest'), // 24 above baseline, 8 below baseline + ), + ], + ), + ); + + final Offset aPos = tester.getTopLeft(find.text('a')); + final Offset bPos = tester.getTopLeft(find.text('b')); + expect(aPos.dy, 0.0); + expect(bPos.dy, 0.0); + }); } HitsRenderBox hits(RenderBox renderBox) => HitsRenderBox(renderBox);