diff --git a/lib/common/widgets/flutter/text_field/controller.dart b/lib/common/widgets/flutter/text_field/controller.dart index 0b7205d7b..1ae98e4ac 100644 --- a/lib/common/widgets/flutter/text_field/controller.dart +++ b/lib/common/widgets/flutter/text_field/controller.dart @@ -657,6 +657,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); @@ -689,6 +692,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 54ce94525..bea6527d6 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);