diff --git a/lib/common/widgets/flutter/text_field/controller.dart b/lib/common/widgets/flutter/text_field/controller.dart index dd1086c30..0e491377a 100644 --- a/lib/common/widgets/flutter/text_field/controller.dart +++ b/lib/common/widgets/flutter/text_field/controller.dart @@ -652,6 +652,9 @@ class RichTextEditingController extends TextEditingController { } case TextEditingDeltaNonTextUpdate e: + if (!_isSelectionValid(e.selection, items.lastOrNull?.range.end ?? 0)) { + return; + } newSelection = e.selection; if (newSelection.isCollapsed) { final newPos = dragOffset(newSelection.base); @@ -684,6 +687,10 @@ class RichTextEditingController extends TextEditingController { } } + static bool _isSelectionValid(TextSelection selection, int length) { + return selection.start <= length && selection.end <= length; + } + TextStyle? composingStyle; TextStyle? richStyle; diff --git a/lib/common/widgets/flutter/text_field/editable_text.dart b/lib/common/widgets/flutter/text_field/editable_text.dart index 8693025ca..8300beafc 100644 --- a/lib/common/widgets/flutter/text_field/editable_text.dart +++ b/lib/common/widgets/flutter/text_field/editable_text.dart @@ -3568,10 +3568,12 @@ class EditableTextState extends State remoteValue = delta.apply(remoteValue); } + final plainText = widget.controller.plainText; + final composing = textEditingDeltas.last.composing; final newValue = TextEditingValue( - text: widget.controller.plainText, + text: plainText, selection: widget.controller.newSelection, - composing: textEditingDeltas.last.composing, + composing: composing.end <= plainText.length ? composing : .empty, ); updateEditingValue(newValue, remoteValue: remoteValue);