Unverified Commit 93a11777 authored by Jason Simmons's avatar Jason Simmons Committed by GitHub

Invalidate the TextPainter line metrics cache when redoing text layout (#97446)

parent 6aed693c
...@@ -648,7 +648,8 @@ class TextPainter { ...@@ -648,7 +648,8 @@ class TextPainter {
_createParagraph(); _createParagraph();
_lastMinWidth = minWidth; _lastMinWidth = minWidth;
_lastMaxWidth = maxWidth; _lastMaxWidth = maxWidth;
// A change in layout invalidates the cached caret metrics as well. // A change in layout invalidates the cached caret and line metrics as well.
_lineMetricsCache = null;
_previousCaretPosition = null; _previousCaretPosition = null;
_previousCaretPrototype = null; _previousCaretPrototype = null;
_layoutParagraph(minWidth, maxWidth); _layoutParagraph(minWidth, maxWidth);
......
...@@ -2416,7 +2416,7 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin, ...@@ -2416,7 +2416,7 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin,
// ui.LineMetrics, then we can get rid of this. // ui.LineMetrics, then we can get rid of this.
final Offset offset = _textPainter.getOffsetForCaret(startPosition, Rect.zero); final Offset offset = _textPainter.getOffsetForCaret(startPosition, Rect.zero);
for (final ui.LineMetrics lineMetrics in metrics) { for (final ui.LineMetrics lineMetrics in metrics) {
if (lineMetrics.baseline + lineMetrics.descent > offset.dy) { if (lineMetrics.baseline > offset.dy) {
return MapEntry<int, Offset>(lineMetrics.lineNumber, Offset(offset.dx, lineMetrics.baseline)); return MapEntry<int, Offset>(lineMetrics.lineNumber, Offset(offset.dx, lineMetrics.baseline));
} }
} }
......
...@@ -996,6 +996,26 @@ void main() { ...@@ -996,6 +996,26 @@ void main() {
ui.Rect.zero); ui.Rect.zero);
expect(caretOffset.dx, painter.width); expect(caretOffset.dx, painter.width);
}, skip: kIsWeb && !isCanvasKit); // https://github.com/flutter/flutter/issues/87545 }, skip: kIsWeb && !isCanvasKit); // https://github.com/flutter/flutter/issues/87545
test('TextPainter line metrics update after layout', () {
final TextPainter painter = TextPainter()
..textDirection = TextDirection.ltr;
const String text = 'word1 word2 word3';
painter.text = const TextSpan(
text: text,
);
painter.layout(maxWidth: 80);
List<ui.LineMetrics> lines = painter.computeLineMetrics();
expect(lines.length, 3);
painter.layout(maxWidth: 1000);
lines = painter.computeLineMetrics();
expect(lines.length, 1);
}, skip: kIsWeb && !isCanvasKit); // https://github.com/flutter/flutter/issues/62819
} }
class MockCanvas extends Fake implements Canvas { class MockCanvas extends Fake implements Canvas {
......
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