Compare commits

...

1 Commits
2.0.9.1 ... dev

Author SHA1 Message Date
dom
953fdbb6bc fix RichTextField selection
Signed-off-by: dom <githubaccount56556@proton.me>
2026-06-10 10:54:04 +08:00
2 changed files with 5 additions and 21 deletions

View File

@@ -176,7 +176,6 @@ class RichTextItem {
if (insertionOffset == 0 && range.start == 0) { if (insertionOffset == 0 && range.start == 0) {
final insertedLength = delta.textInserted.length; final insertedLength = delta.textInserted.length;
controller.newSelection = TextSelection.collapsed(offset: insertedLength);
if (!isRich && delta.isText) { if (!isRich && delta.isText) {
text = delta.textInserted + text; text = delta.textInserted + text;
range = TextRange(start: range.start, end: range.start + text.length); range = TextRange(start: range.start, end: range.start + text.length);
@@ -208,7 +207,6 @@ class RichTextItem {
if (range.end == insertionOffset) { if (range.end == insertionOffset) {
final end = insertionOffset + delta.textInserted.length; final end = insertionOffset + delta.textInserted.length;
controller.newSelection = TextSelection.collapsed(offset: end);
if ((isText && delta.isText) || (isComposing && delta.isComposing)) { if ((isText && delta.isText) || (isComposing && delta.isComposing)) {
text += delta.textInserted; text += delta.textInserted;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
@@ -232,7 +230,6 @@ class RichTextItem {
final leadingText = text.substring(0, insertionOffset - range.start); final leadingText = text.substring(0, insertionOffset - range.start);
final trailingString = text.substring(leadingText.length); final trailingString = text.substring(leadingText.length);
final insertEnd = insertionOffset + delta.textInserted.length; final insertEnd = insertionOffset + delta.textInserted.length;
controller.newSelection = TextSelection.collapsed(offset: insertEnd);
if (delta.isText) { if (delta.isText) {
text = leadingText + delta.textInserted + trailingString; text = leadingText + delta.textInserted + trailingString;
range = TextRange( range = TextRange(
@@ -380,9 +377,6 @@ class RichTextItem {
); );
final end = range.start + text.length; final end = range.start + text.length;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
controller.newSelection = TextSelection.collapsed(
offset: replacedRange.start + delta.replacementText.length,
);
return null; return null;
} else { } else {
final leadingText = text.substring( final leadingText = text.substring(
@@ -391,7 +385,6 @@ class RichTextItem {
); );
final trailString = text.substring(replacedRange.end - range.start); final trailString = text.substring(replacedRange.end - range.start);
final insertEnd = replacedRange.start + delta.replacementText.length; final insertEnd = replacedRange.start + delta.replacementText.length;
controller.newSelection = TextSelection.collapsed(offset: insertEnd);
final config = delta.config; final config = delta.config;
final insertedItem = RichTextItem( final insertedItem = RichTextItem(
type: config.type, type: config.type,
@@ -429,7 +422,6 @@ class RichTextItem {
id = config.id; id = config.id;
final end = range.start + text.length; final end = range.start + text.length;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
controller.newSelection = TextSelection.collapsed(offset: end);
return null; return null;
} }
@@ -443,7 +435,6 @@ class RichTextItem {
id = config.id; id = config.id;
final end = range.start + text.length; final end = range.start + text.length;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
controller.newSelection = TextSelection.collapsed(offset: end);
return (remove: false, toAdd: null); return (remove: false, toAdd: null);
} }
return (remove: true, toAdd: null); return (remove: true, toAdd: null);
@@ -459,7 +450,6 @@ class RichTextItem {
); );
final end = range.start + text.length; final end = range.start + text.length;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
controller.newSelection = TextSelection.collapsed(offset: end);
return null; return null;
} else { } else {
text = text.replaceRange( text = text.replaceRange(
@@ -478,7 +468,6 @@ class RichTextItem {
id: config.id, id: config.id,
range: TextRange(start: replacedRange.start, end: end), range: TextRange(start: replacedRange.start, end: end),
); );
controller.newSelection = TextSelection.collapsed(offset: end);
return (remove: false, toAdd: [insertedItem]); return (remove: false, toAdd: [insertedItem]);
} }
} }
@@ -489,7 +478,6 @@ class RichTextItem {
id = config.id; id = config.id;
final end = range.start + text.length; final end = range.start + text.length;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
controller.newSelection = TextSelection.collapsed(offset: end);
return null; return null;
} }
@@ -512,7 +500,6 @@ class RichTextItem {
); );
final end = range.start + text.length; final end = range.start + text.length;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
controller.newSelection = TextSelection.collapsed(offset: end);
return null; return null;
} else { } else {
final end = range.start + delta.replacementText.length; final end = range.start + delta.replacementText.length;
@@ -525,7 +512,6 @@ class RichTextItem {
id: config.id, id: config.id,
range: TextRange(start: range.start, end: end), range: TextRange(start: range.start, end: end),
); );
controller.newSelection = TextSelection.collapsed(offset: end);
text = text.substring(replacedRange.end - range.start); text = text.substring(replacedRange.end - range.start);
range = TextRange(start: end, end: end + text.length); range = TextRange(start: end, end: end + text.length);
return (remove: true, toAdd: [insertedItem]); return (remove: true, toAdd: [insertedItem]);
@@ -538,7 +524,6 @@ class RichTextItem {
id = config.id; id = config.id;
final end = range.start + text.length; final end = range.start + text.length;
range = TextRange(start: range.start, end: end); range = TextRange(start: range.start, end: end);
controller.newSelection = TextSelection.collapsed(offset: end);
return null; return null;
} }
@@ -613,6 +598,7 @@ class RichTextEditingController extends TextEditingController {
onMention?.call(); onMention?.call();
} }
newSelection = delta.selection;
if (items.isEmpty) { if (items.isEmpty) {
final config = delta.config; final config = delta.config;
items.add( items.add(
@@ -624,9 +610,6 @@ class RichTextEditingController extends TextEditingController {
id: config.id, id: config.id,
), ),
); );
newSelection = TextSelection.collapsed(
offset: delta.textInserted.length,
);
return; return;
} }
for (int index = 0; index < items.length; index++) { for (int index = 0; index < items.length; index++) {
@@ -652,6 +635,7 @@ class RichTextEditingController extends TextEditingController {
} }
case TextEditingDeltaReplacement e: case TextEditingDeltaReplacement e:
newSelection = delta.selection;
for (int index = 0; index < items.length; index++) { for (int index = 0; index < items.length; index++) {
final item = items[index]; final item = items[index];
({bool remove, List<RichTextItem>? toAdd})? res = item.onReplace( ({bool remove, List<RichTextItem>? toAdd})? res = item.onReplace(

View File

@@ -2627,7 +2627,7 @@ class EditableTextState extends State<EditableText>
composing: TextRange.empty, composing: TextRange.empty,
), ),
); );
final newValue = _value.copyWith( final newValue = TextEditingValue(
text: widget.controller.plainText, text: widget.controller.plainText,
selection: widget.controller.newSelection, selection: widget.controller.newSelection,
composing: TextRange.empty, composing: TextRange.empty,
@@ -3569,7 +3569,7 @@ class EditableTextState extends State<EditableText>
remoteValue = delta.apply(remoteValue); remoteValue = delta.apply(remoteValue);
} }
final newValue = _value.copyWith( final newValue = TextEditingValue(
text: widget.controller.plainText, text: widget.controller.plainText,
selection: widget.controller.newSelection, selection: widget.controller.newSelection,
composing: textEditingDeltas.last.composing, composing: textEditingDeltas.last.composing,
@@ -5552,7 +5552,7 @@ class EditableTextState extends State<EditableText>
), ),
); );
final newValue = oldValue.copyWith( final newValue = TextEditingValue(
text: widget.controller.plainText, text: widget.controller.plainText,
selection: widget.controller.newSelection, selection: widget.controller.newSelection,
composing: TextRange.empty, composing: TextRange.empty,