Skip to content

Chore(breaking changes): Replace TextInputClient with DeltaTextInputClient #2510

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 44 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
3297a1f
Chore: improved input client service
Feb 21, 2025
b812460
Chore: minor changes
Mar 11, 2025
7685b57
Chore: renamed input client to the old name of the text input clinet
Mar 11, 2025
5a3dab3
Chore: removed unnecessary print
Mar 12, 2025
e039446
Chore: moved internal editing extensions and change List deltas to a …
Mar 12, 2025
bcacc27
Chore: removed unused import
Mar 12, 2025
a4d567a
doc: update controller length extension method deprecation message (#…
realth000 Feb 20, 2025
1a287b7
chore: update GitHub bug template to require the package version input
EchoEllet Feb 20, 2025
54ccff3
Focus and open context menu on right click if unfocused (#2477)
tjarvstrand Feb 21, 2025
dfb7bbc
Expose Rule type so that Document.setCustomRules can be used (#2484)
tjarvstrand Feb 22, 2025
eb91d24
feat: Enable BoxDecoration for DefaultTextBlockStyle of header Attrib…
satotoshitaka11 Feb 24, 2025
8d63996
fix: unpredictable endless loop of '_handleFocusChanged' in the phase…
chaosue Mar 3, 2025
62ecf21
chore(release): prepare to publish 11.1.0
EchoEllet Mar 10, 2025
24e1305
Chore: added change to CHANGELOG
Mar 12, 2025
3a147cf
Merge branch 'master' into improve_input_client
CatHood0 Mar 12, 2025
9000119
Chore: minor changes
Mar 12, 2025
1518987
Chore: removed debounce timer since it does not needed in our impleme…
Mar 12, 2025
50a1499
Chore: removed commented neccesary schedulers
Mar 12, 2025
d998e45
Chore: removed unnecessary _updateComposing method
Mar 12, 2025
6ceef54
Fix: buggy behavior of the caret when try to delete characters on and…
Mar 12, 2025
fd66368
Chore: used old implementation for web since the new one does not wor…
Mar 12, 2025
e98e16d
Chore: removed composing range validation to get the cursorPosition f…
Mar 12, 2025
9202560
Chore: replaced use of dart:io to use platform utils
Mar 12, 2025
25d07ad
Chore: fix buggy behavior in onDelete on web browsers
Mar 12, 2025
9ff127d
Chore: removed formatters since them are not doing nothing and cause …
Mar 12, 2025
70ccec1
Chore: replaced get selection from controller to use the one from the…
Mar 12, 2025
b5ee9f4
Chore: removed unused import
Mar 12, 2025
aad0b56
Fix: removed unused imports and deleted import for formatters
Mar 12, 2025
ea112f1
Chore: removed unnecessary double check for use CharacterShortcutEvet…
Mar 12, 2025
fa3dbc3
Chore: updated change title in CHANGELOG
Mar 12, 2025
f12327b
Chore: update pubspec.lock from example
Mar 13, 2025
b1fbe0a
Chore: use insertion.insertionOffset instead selection from new value
Mar 13, 2025
2e1de1d
merge branch 'master' into better_soft_keyboard_support
Mar 13, 2025
f59c58b
Chore: improved perfomance of ime operations
Mar 13, 2025
155491f
Chore: removed unused imports in text_input_mixin
Mar 13, 2025
cf46f8c
Merge branch 'master' into better_soft_keyboard_support
EchoEllet Mar 19, 2025
1d0aa63
Chore: implemented delta_text_input_client instead diffing string cha…
Mar 29, 2025
2936b93
Chore: format
Mar 29, 2025
a9f2b5b
Chore: removed TextInputClient by recommendation of flutter docs
Mar 29, 2025
44bdd3d
Chore: removed use of updateEditingValue by recommendation of flutter…
Mar 29, 2025
61d753d
Merge 'master' into better_soft_keyboard_support
Mar 29, 2025
924a27b
Chore: added method for apply deltas to the last known editing value
Mar 29, 2025
74287ae
Fix: missed method name change
Mar 29, 2025
dc438bf
Chore: moved ime helpers to be part of ime_internals file
Mar 29, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Changed

- Improved support for soft-keyboards on the `TextInputClient` [#2509](https://github.com/singerdmx/flutter-quill/pull/2509).

## [11.1.0] - 2025-03-11

### Fixed
Expand Down
86 changes: 43 additions & 43 deletions example/pubspec.lock
Original file line number Diff line number Diff line change
Expand Up @@ -13,26 +13,26 @@ packages:
dependency: transitive
description:
name: async
sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63
sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c"
url: "https://pub.dev"
source: hosted
version: "2.12.0"
version: "2.11.0"
boolean_selector:
dependency: transitive
description:
name: boolean_selector
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66"
url: "https://pub.dev"
source: hosted
version: "2.1.2"
version: "2.1.1"
characters:
dependency: transitive
description:
name: characters
sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803
sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
version: "1.3.0"
charcode:
dependency: transitive
description:
Expand All @@ -45,18 +45,18 @@ packages:
dependency: transitive
description:
name: clock
sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b
sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf
url: "https://pub.dev"
source: hosted
version: "1.1.2"
version: "1.1.1"
collection:
dependency: transitive
description:
name: collection
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf
url: "https://pub.dev"
source: hosted
version: "1.19.1"
version: "1.19.0"
cross_file:
dependency: transitive
description:
Expand Down Expand Up @@ -93,10 +93,10 @@ packages:
dependency: transitive
description:
name: fake_async
sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc"
sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78"
url: "https://pub.dev"
source: hosted
version: "1.3.2"
version: "1.3.1"
ffi:
dependency: transitive
description:
Expand All @@ -109,10 +109,10 @@ packages:
dependency: transitive
description:
name: file
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
url: "https://pub.dev"
source: hosted
version: "7.0.1"
version: "7.0.0"
file_selector_linux:
dependency: transitive
description:
Expand Down Expand Up @@ -373,18 +373,18 @@ packages:
dependency: transitive
description:
name: leak_tracker
sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec
sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06"
url: "https://pub.dev"
source: hosted
version: "10.0.8"
version: "10.0.7"
leak_tracker_flutter_testing:
dependency: transitive
description:
name: leak_tracker_flutter_testing
sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573
sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379"
url: "https://pub.dev"
source: hosted
version: "3.0.9"
version: "3.0.8"
leak_tracker_testing:
dependency: transitive
description:
Expand Down Expand Up @@ -413,10 +413,10 @@ packages:
dependency: transitive
description:
name: matcher
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb
url: "https://pub.dev"
source: hosted
version: "0.12.17"
version: "0.12.16+1"
material_color_utilities:
dependency: transitive
description:
Expand All @@ -429,10 +429,10 @@ packages:
dependency: transitive
description:
name: meta
sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c
sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7
url: "https://pub.dev"
source: hosted
version: "1.16.0"
version: "1.15.0"
mime:
dependency: transitive
description:
Expand All @@ -445,10 +445,10 @@ packages:
dependency: "direct main"
description:
name: path
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af"
url: "https://pub.dev"
source: hosted
version: "1.9.1"
version: "1.9.0"
photo_view:
dependency: transitive
description:
Expand All @@ -461,10 +461,10 @@ packages:
dependency: transitive
description:
name: platform
sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984"
sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65"
url: "https://pub.dev"
source: hosted
version: "3.1.6"
version: "3.1.5"
plugin_platform_interface:
dependency: transitive
description:
Expand All @@ -477,10 +477,10 @@ packages:
dependency: transitive
description:
name: process
sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d"
sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32"
url: "https://pub.dev"
source: hosted
version: "5.0.3"
version: "5.0.2"
quill_native_bridge:
dependency: transitive
description:
Expand Down Expand Up @@ -562,34 +562,34 @@ packages:
dependency: transitive
description:
name: source_span
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev"
source: hosted
version: "1.10.1"
version: "1.10.0"
stack_trace:
dependency: transitive
description:
name: stack_trace
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377"
url: "https://pub.dev"
source: hosted
version: "1.12.1"
version: "1.12.0"
stream_channel:
dependency: transitive
description:
name: stream_channel
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.dev"
source: hosted
version: "2.1.4"
version: "2.1.2"
string_scanner:
dependency: transitive
description:
name: string_scanner
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3"
url: "https://pub.dev"
source: hosted
version: "1.4.1"
version: "1.3.0"
sync_http:
dependency: transitive
description:
Expand All @@ -602,18 +602,18 @@ packages:
dependency: transitive
description:
name: term_glyph
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84
url: "https://pub.dev"
source: hosted
version: "1.2.2"
version: "1.2.1"
test_api:
dependency: transitive
description:
name: test_api
sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd
sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c"
url: "https://pub.dev"
source: hosted
version: "0.7.4"
version: "0.7.3"
typed_data:
dependency: transitive
description:
Expand Down Expand Up @@ -738,10 +738,10 @@ packages:
dependency: transitive
description:
name: vm_service
sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14"
sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b
url: "https://pub.dev"
source: hosted
version: "14.3.1"
version: "14.3.0"
web:
dependency: transitive
description:
Expand All @@ -767,5 +767,5 @@ packages:
source: hosted
version: "5.10.1"
sdks:
dart: ">=3.7.0-0 <4.0.0"
dart: ">=3.6.0 <4.0.0"
flutter: ">=3.27.0"
1 change: 0 additions & 1 deletion lib/src/delta/delta_diff.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ Diff getDiff(String oldText, String newText, int cursorPosition) {
end > limit && oldText[end - 1] == newText[end + delta - 1];
end--) {}
var start = 0;
//TODO: we need to improve this part because this loop has a lot of unsafe index operations
for (final startLimit = cursorPosition - math.max(0, delta);
start < startLimit &&
(start > oldText.length - 1 ? '' : oldText[start]) ==
Expand Down
59 changes: 59 additions & 0 deletions lib/src/editor/raw_editor/input/diff_services.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import 'package:flutter/services.dart';
import '../../../delta/delta_diff.dart';

/// Return a list of the change type that was do it to the content of the editor
TextEditingDelta getTextEditingDelta(
TextEditingValue? oldValue,
TextEditingValue newValue,
) {
if (oldValue == null || oldValue.text == newValue.text) {
return TextEditingDeltaNonTextUpdate(
oldText: newValue.text,
selection: newValue.selection,
composing: newValue.composing,
);
}
final currentText = oldValue.text;
final diff = getDiff(
currentText,
newValue.text,
newValue.selection.extentOffset,
);
if (diff.inserted.isNotEmpty && diff.deleted.isEmpty) {
return TextEditingDeltaInsertion(
oldText: currentText,
textInserted: diff.inserted,
insertionOffset: diff.start,
selection: newValue.selection,
composing: newValue.composing,
);
} else if (diff.inserted.isEmpty && diff.deleted.isNotEmpty) {
return TextEditingDeltaDeletion(
oldText: currentText,
selection: newValue.selection,
composing: newValue.composing,
deletedRange: TextRange(
start: diff.start,
end: diff.start + diff.deleted.length,
),
);
} else if (diff.inserted.isNotEmpty && diff.deleted.isNotEmpty) {
return TextEditingDeltaReplacement(
oldText: currentText,
selection: newValue.selection,
composing: newValue.composing,
replacementText: diff.inserted,
replacedRange: TextRange(
start: diff.start,
end: diff.start + diff.deleted.length,
),
);
} else if (diff.inserted.isEmpty && diff.deleted.isEmpty) {
return TextEditingDeltaNonTextUpdate(
oldText: newValue.text,
selection: newValue.selection,
composing: newValue.composing,
);
}
throw UnsupportedError('Unknown diff: $diff');
}
Loading