Unverified Commit a4de06ad authored by Michael Goderbauer's avatar Michael Goderbauer Committed by GitHub

Reapply "Fix overflow clipping/fading for text (#27892)" (#27980)

Fixes https://github.com/flutter/flutter/issues/25025
parent 3b47b443
......@@ -281,15 +281,16 @@ class RenderParagraph extends RenderBox {
@override
void performLayout() {
_layoutTextWithConstraints(constraints);
// We grab _textPainter.size here because assigning to `size` will trigger
// us to validate our intrinsic sizes, which will change _textPainter's
// layout because the intrinsic size calculations are destructive.
// Other _textPainter state like didExceedMaxLines will also be affected.
// See also RenderEditable which has a similar issue.
// We grab _textPainter.size and _textPainter.didExceedMaxLines here because
// assigning to `size` will trigger us to validate our intrinsic sizes,
// which will change _textPainter's layout because the intrinsic size
// calculations are destructive. Other _textPainter state will also be
// affected. See also RenderEditable which has a similar issue.
final Size textSize = _textPainter.size;
final bool didOverflowHeight = _textPainter.didExceedMaxLines;
final bool textDidExceedMaxLines = _textPainter.didExceedMaxLines;
size = constraints.constrain(textSize);
final bool didOverflowHeight = size.height < textSize.height || textDidExceedMaxLines;
final bool didOverflowWidth = size.width < textSize.width;
// TODO(abarth): We're only measuring the sizes of the line boxes here. If
// the glyphs draw outside the line boxes, we might think that there isn't
......
......@@ -7,6 +7,7 @@ import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter/foundation.dart';
import '../rendering/mock_canvas.dart';
import 'semantics_tester.dart';
void main() {
......@@ -246,4 +247,73 @@ void main() {
expect(semantics, hasSemantics(expectedSemantics, ignoreTransform: true, ignoreId: true));
semantics.dispose();
}, skip: true); // TODO(jonahwilliams): correct once https://github.com/flutter/flutter/issues/20891 is resolved.
testWidgets('Overflow is clipping correctly - short text with overflow: clip', (WidgetTester tester) async {
await _pumpTextWidget(
tester: tester,
overflow: TextOverflow.clip,
text: 'Hi',
);
expect(find.byType(Text), isNot(paints..clipRect()));
});
testWidgets('Overflow is clipping correctly - long text with overflow: ellipsis', (WidgetTester tester) async {
await _pumpTextWidget(
tester: tester,
overflow: TextOverflow.ellipsis,
text: 'a long long long long text, should be clip',
);
expect(find.byType(Text), paints..clipRect(rect: Rect.fromLTWH(0, 0, 50, 50)));
});
testWidgets('Overflow is clipping correctly - short text with overflow: ellipsis', (WidgetTester tester) async {
await _pumpTextWidget(
tester: tester,
overflow: TextOverflow.ellipsis,
text: 'Hi',
);
expect(find.byType(Text), isNot(paints..clipRect()));
});
testWidgets('Overflow is clipping correctly - long text with overflow: fade', (WidgetTester tester) async {
await _pumpTextWidget(
tester: tester,
overflow: TextOverflow.fade,
text: 'a long long long long text, should be clip',
);
expect(find.byType(Text), paints..clipRect(rect: Rect.fromLTWH(0, 0, 50, 50)));
});
testWidgets('Overflow is clipping correctly - short text with overflow: fade', (WidgetTester tester) async {
await _pumpTextWidget(
tester: tester,
overflow: TextOverflow.fade,
text: 'Hi',
);
expect(find.byType(Text), isNot(paints..clipRect()));
});
}
Future<void> _pumpTextWidget({ WidgetTester tester, String text, TextOverflow overflow }) {
return tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: Container(
width: 50.0,
height: 50.0,
child: Text(
text,
overflow: overflow,
),
),
),
),
);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment