1
0
mirror of https://github.com/flutter/samples.git synced 2025-11-08 13:58:47 +00:00

[simplistic_editor] - Fix delete key on desktop and backspace key on Web (#1458)

* Do not propagate to default text intent

* Add support for backward and forward delete (desktop)

* Update for nice auto-format

* Fix using delete key throws if at the end of the text

Co-authored-by: Bruno Leroux <bruno.leroux@gmail.com>
This commit is contained in:
Bruno Leroux
2022-10-05 08:47:51 +02:00
committed by GitHub
parent a695bfca78
commit 06a159a465

View File

@@ -299,7 +299,7 @@ class BasicTextInputClientState extends State<BasicTextInputClient>
TextSelection get _selection => _value.selection;
late final Map<Type, Action<Intent>> _actions = <Type, Action<Intent>>{
DeleteCharacterIntent: CallbackAction<DeleteCharacterIntent>(
onInvoke: (intent) => _delete(),
onInvoke: (intent) => _delete(intent.forward),
),
ExtendSelectionByCharacterIntent:
CallbackAction<ExtendSelectionByCharacterIntent>(
@@ -315,22 +315,35 @@ class BasicTextInputClientState extends State<BasicTextInputClient>
PasteTextIntent: CallbackAction<PasteTextIntent>(
onInvoke: (intent) => pasteText(intent.cause),
),
DoNothingAndStopPropagationTextIntent: DoNothingAction(
consumesKey: false,
),
};
void _delete() {
void _delete(bool forward) {
if (_value.text.isEmpty) return;
late final TextRange deletedRange;
late final TextRange newComposing;
final int deletedLength =
_value.text.substring(0, _selection.baseOffset).characters.last.length;
late final String deletedText;
final int offset = _selection.baseOffset;
if (_selection.isCollapsed) {
if (_selection.baseOffset == 0) return;
if (forward) {
if (_selection.baseOffset == _value.text.length) return;
deletedText = _value.text.substring(offset).characters.first;
deletedRange = TextRange(
start: _selection.baseOffset - deletedLength,
end: _selection.baseOffset,
start: offset,
end: offset + deletedText.length,
);
} else {
if (_selection.baseOffset == 0) return;
deletedText = _value.text.substring(0, offset).characters.last;
deletedRange = TextRange(
start: offset - deletedText.length,
end: offset,
);
}
} else {
deletedRange = _selection;
}