diff --git a/packages/flutter/lib/src/rendering/paragraph.dart b/packages/flutter/lib/src/rendering/paragraph.dart index 4500a05017..066f6137e7 100644 --- a/packages/flutter/lib/src/rendering/paragraph.dart +++ b/packages/flutter/lib/src/rendering/paragraph.dart @@ -1497,7 +1497,7 @@ class _SelectableFragment with Selectable, ChangeNotifier implements TextLayoutM assert(word.start >= range.start && word.end <= range.end); late TextPosition start; late TextPosition end; - if (position.offset >= word.end) { + if (position.offset > word.end) { start = end = TextPosition(offset: position.offset); } else { start = TextPosition(offset: word.start); diff --git a/packages/flutter/test/rendering/paragraph_test.dart b/packages/flutter/test/rendering/paragraph_test.dart index db3d19e547..1dfcd27183 100644 --- a/packages/flutter/test/rendering/paragraph_test.dart +++ b/packages/flutter/test/rendering/paragraph_test.dart @@ -821,6 +821,34 @@ void main() { expect(paintingContext.canvas.drawnRectPaint!.color, selectionColor); }); +// Regression test for https://github.com/flutter/flutter/issues/126652. + test('paints selection when tap at chinese character', () async { + final TestSelectionRegistrar registrar = TestSelectionRegistrar(); + const Color selectionColor = Color(0xAF6694e8); + final RenderParagraph paragraph = RenderParagraph( + const TextSpan(text: '你好'), + textDirection: TextDirection.ltr, + registrar: registrar, + selectionColor: selectionColor, + ); + layout(paragraph); + final MockPaintingContext paintingContext = MockPaintingContext(); + paragraph.paint(paintingContext, Offset.zero); + expect(paintingContext.canvas.drawnRect, isNull); + expect(paintingContext.canvas.drawnRectPaint, isNull); + + for (final Selectable selectable in (paragraph.registrar! as TestSelectionRegistrar).selectables) { + selectable.dispatchSelectionEvent(const SelectWordSelectionEvent(globalPosition: Offset(7, 0))); + } + + paintingContext.canvas.clear(); + paragraph.paint(paintingContext, Offset.zero); + expect(paintingContext.canvas.drawnRect, + const Rect.fromLTWH(0.0, 0.0, 14.0, 14.0)); + expect(paintingContext.canvas.drawnRectPaint!.style, PaintingStyle.fill); + expect(paintingContext.canvas.drawnRectPaint!.color, selectionColor); + }, skip: isBrowser); // https://github.com/flutter/flutter/issues/61016 + test('getPositionForOffset works', () async { final RenderParagraph paragraph = RenderParagraph(const TextSpan(text: '1234567'), textDirection: TextDirection.ltr); layout(paragraph);