Unverified Commit 0f8148ec authored by LongCatIsLooong's avatar LongCatIsLooong Committed by GitHub

[RenderEditable] Dont paint caret when selection is invalid (#79607)

parent f4c74a6e
......@@ -3703,7 +3703,10 @@ class RenderEditable extends RenderBox with RelayoutWhenSystemFontsChangeMixin {
_clipRectLayer = null;
_paintContents(context, offset);
}
_paintHandleLayers(context, getEndpointsForSelection(selection!));
final TextSelection? selection = this.selection;
if (selection != null) {
_paintHandleLayers(context, getEndpointsForSelection(selection));
}
}
ClipRectLayer? _clipRectLayer;
......@@ -4060,9 +4063,7 @@ class _FloatingCursorPainter extends RenderEditablePainter {
assert(renderEditable != null);
final TextSelection? selection = renderEditable.selection;
// TODO(LongCatIsLooong): skip painting the caret when the selection is
// (-1, -1).
if (selection == null || !selection.isCollapsed)
if (selection == null || !selection.isCollapsed || !selection.isValid)
return;
final Rect? floatingCursorRect = this.floatingCursorRect;
......
......@@ -412,6 +412,51 @@ void main() {
expect(editable, paintsExactlyCountTimes(#drawRect, 1));
});
test('does not paint the caret when selection is null', () async {
final TextSelectionDelegate delegate = FakeEditableTextState();
final ValueNotifier<bool> showCursor = ValueNotifier<bool>(true);
final RenderEditable editable = RenderEditable(
backgroundCursorColor: Colors.grey,
selectionColor: Colors.black,
paintCursorAboveText: true,
textDirection: TextDirection.ltr,
cursorColor: Colors.red,
showCursor: showCursor,
offset: ViewportOffset.zero(),
textSelectionDelegate: delegate,
text: const TextSpan(
text: 'test',
style: TextStyle(
height: 1.0, fontSize: 10.0, fontFamily: 'Ahem',
),
),
startHandleLayerLink: LayerLink(),
endHandleLayerLink: LayerLink(),
selection: const TextSelection.collapsed(
offset: 2,
affinity: TextAffinity.upstream,
),
);
layout(editable);
expect(
editable,
paints
..paragraph()
// Red collapsed cursor is painted, not a selection box.
..rect(color: Colors.red[500]),
);
// Let the RenderEditable paint again. Setting the selection to null should
// prevent the caret from being painted.
editable.selection = null;
// Still paints the paragraph.
expect(editable, paints..paragraph());
// No longer paints the caret.
expect(editable, isNot(paints..rect(color: Colors.red[500])));
});
test('selects correct place with offsets', () {
const String text = 'test\ntest';
final TextSelectionDelegate delegate = FakeEditableTextState()
......
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