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:
@@ -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;
|
||||
deletedRange = TextRange(
|
||||
start: _selection.baseOffset - deletedLength,
|
||||
end: _selection.baseOffset,
|
||||
);
|
||||
if (forward) {
|
||||
if (_selection.baseOffset == _value.text.length) return;
|
||||
deletedText = _value.text.substring(offset).characters.first;
|
||||
deletedRange = TextRange(
|
||||
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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user