Skip to content

Commit 475ccfc

Browse files
committed
expose IME composing range in QuillController
1 parent e14689b commit 475ccfc

File tree

2 files changed

+20
-2
lines changed

2 files changed

+20
-2
lines changed

lib/src/controller/quill_controller.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'dart:math' as math;
22

3+
import 'package:flutter/foundation.dart';
34
import 'package:flutter/services.dart' show ClipboardData, Clipboard;
45
import 'package:flutter/widgets.dart';
56
import 'package:meta/meta.dart';
@@ -48,6 +49,20 @@ class QuillController extends ChangeNotifier {
4849
selection: const TextSelection.collapsed(offset: 0),
4950
);
5051

52+
// Expose current IME composing range for filtering out intermediate edits.
53+
final ValueNotifier<TextRange> _composingRangeNotifier =
54+
ValueNotifier<TextRange>(TextRange.empty);
55+
56+
/// Current IME (Chinese/Japanese etc input method) composing range.
57+
/// This can be used to filter out intermediate edits that happen during IME composition.
58+
ValueListenable<TextRange> get composing => _composingRangeNotifier;
59+
60+
@internal
61+
void setComposingRange(TextRange range) {
62+
if (_composingRangeNotifier.value == range) return;
63+
_composingRangeNotifier.value = range;
64+
}
65+
5166
final QuillControllerConfig config;
5267

5368
/// Document managed by this controller.

lib/src/editor/raw_editor/raw_editor_state_text_input_client_mixin.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@ mixin RawEditorStateTextInputClientMixin on EditorState
1919

2020
set _lastKnownRemoteTextEditingValue(TextEditingValue? value) {
2121
__lastKnownRemoteTextEditingValue = value;
22-
if (composingRange.value != value?.composing) {
23-
composingRange.value = value?.composing ?? TextRange.empty;
22+
final newRange = value?.composing ?? TextRange.empty;
23+
if (composingRange.value != newRange) {
24+
composingRange.value = newRange;
25+
// Forward composing range to the controller
26+
widget.controller.setComposingRange(newRange);
2427
}
2528
}
2629

0 commit comments

Comments
 (0)