File tree 3 files changed +34
-1
lines changed 3 files changed +34
-1
lines changed Original file line number Diff line number Diff line change @@ -586,6 +586,15 @@ class TextPainter {
586
586
return _paragraph! .didExceedMaxLines;
587
587
}
588
588
589
+ /// The distance from the left edge of the leftmost glyph to the right edge of
590
+ /// the rightmost glyph in the paragraph.
591
+ ///
592
+ /// Valid only after [layout] has been called.
593
+ double get longestLine {
594
+ assert (! _debugNeedsLayout);
595
+ return _paragraph! .longestLine;
596
+ }
597
+
589
598
double ? _lastMinWidth;
590
599
double ? _lastMaxWidth;
591
600
Original file line number Diff line number Diff line change @@ -493,6 +493,12 @@ class RenderParagraph extends RenderBox
493
493
@visibleForTesting
494
494
bool get debugHasOverflowShader => _overflowShader != null ;
495
495
496
+ /// Whether this paragraph currently has overflow and needs clipping.
497
+ ///
498
+ /// Used to test this object. Not for use in production.
499
+ @visibleForTesting
500
+ bool get debugNeedsClipping => _needsClipping;
501
+
496
502
void _layoutText ({ double minWidth = 0.0 , double maxWidth = double .infinity }) {
497
503
final bool widthMatters = softWrap || overflow == TextOverflow .ellipsis;
498
504
_textPainter.layout (
@@ -644,7 +650,7 @@ class RenderParagraph extends RenderBox
644
650
size = constraints.constrain (textSize);
645
651
646
652
final bool didOverflowHeight = size.height < textSize.height || textDidExceedMaxLines;
647
- final bool didOverflowWidth = size.width < textSize.width;
653
+ final bool didOverflowWidth = size.width < textSize.width || size.width < _textPainter.longestLine ;
648
654
// TODO(abarth): We're only measuring the sizes of the line boxes here. If
649
655
// the glyphs draw outside the line boxes, we might think that there isn't
650
656
// visual overflow when there actually is visual overflow. This can become
Original file line number Diff line number Diff line change @@ -326,6 +326,24 @@ void main() {
326
326
expect (paragraph.debugHasOverflowShader, isFalse);
327
327
}, skip: isBrowser); // https://github.com/flutter/flutter/issues/61018
328
328
329
+ test ('one character clip test' , () {
330
+ // Regressing test for https://github.com/flutter/flutter/issues/99140
331
+ final RenderParagraph paragraph = RenderParagraph (
332
+ const TextSpan (
333
+ text: '7' ,
334
+ style: TextStyle (fontFamily: 'Ahem' , fontSize: 60.0 ),
335
+ ),
336
+ textDirection: TextDirection .ltr,
337
+ maxLines: 1 ,
338
+ );
339
+
340
+ // Lay out in a narrow box to force clipping.
341
+ // The text width is 60 bigger than the constraints width.
342
+ layout (paragraph, constraints: BoxConstraints .tight (const Size (50.0 , 200.0 )));
343
+
344
+ expect (paragraph.debugNeedsClipping, true );
345
+ }, skip: isBrowser); // https://github.com/flutter/flutter/issues/61018
346
+
329
347
test ('maxLines' , () {
330
348
final RenderParagraph paragraph = RenderParagraph (
331
349
const TextSpan (
You can’t perform that action at this time.
0 commit comments