From 434f2742a609fad35ff7cab3b716e7d23b918dc1 Mon Sep 17 00:00:00 2001 From: dom Date: Wed, 10 Jun 2026 11:11:50 +0800 Subject: [PATCH] fix RichTextField selection (#2374) Signed-off-by: dom --- .../flutter/text_field/controller.dart | 20 ++----------------- .../flutter/text_field/editable_text.dart | 6 +++--- 2 files changed, 5 insertions(+), 21 deletions(-) diff --git a/lib/common/widgets/flutter/text_field/controller.dart b/lib/common/widgets/flutter/text_field/controller.dart index 7e5ad3509..dd1086c30 100644 --- a/lib/common/widgets/flutter/text_field/controller.dart +++ b/lib/common/widgets/flutter/text_field/controller.dart @@ -171,7 +171,6 @@ class RichTextItem { if (insertionOffset == 0 && range.start == 0) { final insertedLength = delta.textInserted.length; - controller.newSelection = TextSelection.collapsed(offset: insertedLength); if (!isRich && delta.isText) { text = delta.textInserted + text; range = TextRange(start: range.start, end: range.start + text.length); @@ -203,7 +202,6 @@ class RichTextItem { if (range.end == insertionOffset) { final end = insertionOffset + delta.textInserted.length; - controller.newSelection = TextSelection.collapsed(offset: end); if ((isText && delta.isText) || (isComposing && delta.isComposing)) { text += delta.textInserted; range = TextRange(start: range.start, end: end); @@ -227,7 +225,6 @@ class RichTextItem { final leadingText = text.substring(0, insertionOffset - range.start); final trailingString = text.substring(leadingText.length); final insertEnd = insertionOffset + delta.textInserted.length; - controller.newSelection = TextSelection.collapsed(offset: insertEnd); if (delta.isText) { text = leadingText + delta.textInserted + trailingString; range = TextRange( @@ -375,9 +372,6 @@ class RichTextItem { ); final end = range.start + text.length; range = TextRange(start: range.start, end: end); - controller.newSelection = TextSelection.collapsed( - offset: replacedRange.start + delta.replacementText.length, - ); return null; } else { final leadingText = text.substring( @@ -386,7 +380,6 @@ class RichTextItem { ); final trailString = text.substring(replacedRange.end - range.start); final insertEnd = replacedRange.start + delta.replacementText.length; - controller.newSelection = TextSelection.collapsed(offset: insertEnd); final config = delta.config; final insertedItem = RichTextItem( type: config.type, @@ -424,7 +417,6 @@ class RichTextItem { id = config.id; final end = range.start + text.length; range = TextRange(start: range.start, end: end); - controller.newSelection = TextSelection.collapsed(offset: end); return null; } @@ -438,7 +430,6 @@ class RichTextItem { id = config.id; final end = range.start + text.length; range = TextRange(start: range.start, end: end); - controller.newSelection = TextSelection.collapsed(offset: end); return (remove: false, toAdd: null); } return (remove: true, toAdd: null); @@ -454,7 +445,6 @@ class RichTextItem { ); final end = range.start + text.length; range = TextRange(start: range.start, end: end); - controller.newSelection = TextSelection.collapsed(offset: end); return null; } else { text = text.replaceRange( @@ -473,7 +463,6 @@ class RichTextItem { id: config.id, range: TextRange(start: replacedRange.start, end: end), ); - controller.newSelection = TextSelection.collapsed(offset: end); return (remove: false, toAdd: [insertedItem]); } } @@ -484,7 +473,6 @@ class RichTextItem { id = config.id; final end = range.start + text.length; range = TextRange(start: range.start, end: end); - controller.newSelection = TextSelection.collapsed(offset: end); return null; } @@ -507,7 +495,6 @@ class RichTextItem { ); final end = range.start + text.length; range = TextRange(start: range.start, end: end); - controller.newSelection = TextSelection.collapsed(offset: end); return null; } else { final end = range.start + delta.replacementText.length; @@ -520,7 +507,6 @@ class RichTextItem { id: config.id, range: TextRange(start: range.start, end: end), ); - controller.newSelection = TextSelection.collapsed(offset: end); text = text.substring(replacedRange.end - range.start); range = TextRange(start: end, end: end + text.length); return (remove: true, toAdd: [insertedItem]); @@ -533,7 +519,6 @@ class RichTextItem { id = config.id; final end = range.start + text.length; range = TextRange(start: range.start, end: end); - controller.newSelection = TextSelection.collapsed(offset: end); return null; } @@ -608,6 +593,7 @@ class RichTextEditingController extends TextEditingController { onMention?.call(); } + newSelection = delta.selection; if (items.isEmpty) { final config = delta.config; items.add( @@ -619,9 +605,6 @@ class RichTextEditingController extends TextEditingController { id: config.id, ), ); - newSelection = TextSelection.collapsed( - offset: delta.textInserted.length, - ); return; } for (int index = 0; index < items.length; index++) { @@ -647,6 +630,7 @@ class RichTextEditingController extends TextEditingController { } case TextEditingDeltaReplacement e: + newSelection = delta.selection; for (int index = 0; index < items.length; index++) { final item = items[index]; ({bool remove, List? toAdd})? res = item.onReplace( diff --git a/lib/common/widgets/flutter/text_field/editable_text.dart b/lib/common/widgets/flutter/text_field/editable_text.dart index c730b3744..bd4fff178 100644 --- a/lib/common/widgets/flutter/text_field/editable_text.dart +++ b/lib/common/widgets/flutter/text_field/editable_text.dart @@ -2627,7 +2627,7 @@ class EditableTextState extends State composing: TextRange.empty, ), ); - final newValue = _value.copyWith( + final newValue = TextEditingValue( text: widget.controller.plainText, selection: widget.controller.newSelection, composing: TextRange.empty, @@ -3569,7 +3569,7 @@ class EditableTextState extends State remoteValue = delta.apply(remoteValue); } - final newValue = _value.copyWith( + final newValue = TextEditingValue( text: widget.controller.plainText, selection: widget.controller.newSelection, composing: textEditingDeltas.last.composing, @@ -5552,7 +5552,7 @@ class EditableTextState extends State ), ); - final newValue = oldValue.copyWith( + final newValue = TextEditingValue( text: widget.controller.plainText, selection: widget.controller.newSelection, composing: TextRange.empty,