Skip to content

Commit e8e4abd

Browse files
authored
Merge pull request #200 from vovaklhdella/fix/add-text-listener-to-languagetool
Add onTextChange listener to LanguageToolTextfield
2 parents 353bb84 + 8cf55ea commit e8e4abd

File tree

3 files changed

+30
-15
lines changed

3 files changed

+30
-15
lines changed

packages/reactive_languagetool_textfield/example/lib/main.dart

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,10 @@ class _MyAppState extends State<MyApp> {
6868
ElevatedButton(
6969
child: const Text('Select all text'),
7070
onPressed: () {
71-
if (_controller != null) {
72-
form.control('input').focus();
73-
74-
_controller?.selection = TextSelection(
75-
baseOffset: 0,
76-
extentOffset: _controller?.text.length ?? 0,
71+
final value = form.control('input').value;
72+
if (value != null) {
73+
ScaffoldMessenger.of(context).showSnackBar(
74+
SnackBar(content: Text('Selected text: ${value.toString()}')),
7775
);
7876
}
7977
},

packages/reactive_languagetool_textfield/lib/src/reactive_languagetool_textfield.dart

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class ReactiveLanguageToolTextField<T> extends ReactiveFormField<T, String> {
2828
final Duration delay;
2929
final DelayType delayType;
3030

31+
final LanguageToolController? _textController;
32+
3133
/// Creates a [ReactiveLanguageToolTextField] that contains a [LanguageToolTextField].
3234
///
3335
/// Can optionally provide a [formControl] to bind this widget to a control.
@@ -98,6 +100,7 @@ class ReactiveLanguageToolTextField<T> extends ReactiveFormField<T, String> {
98100
super.validationMessages,
99101
super.valueAccessor,
100102
super.showErrors,
103+
LanguageToolController? controller,
101104
String language = 'auto',
102105
MistakePopup? mistakePopup,
103106
bool alignCenter = true,
@@ -156,7 +159,8 @@ class ReactiveLanguageToolTextField<T> extends ReactiveFormField<T, String> {
156159
bool enableIMEPersonalizedLearning = true,
157160
bool scribbleEnabled = true,
158161
Widget Function(BuildContext context, String error)? errorBuilder,
159-
}) : super(
162+
}) : _textController = controller,
163+
super(
160164
builder: (ReactiveFormFieldState<T, String> field) {
161165
final state = field as _ReactiveLanguageToolTextFieldState<T>;
162166
final effectiveDecoration = decoration
@@ -218,7 +222,6 @@ class ReactiveLanguageToolTextField<T> extends ReactiveFormField<T, String> {
218222
minLines: minLines,
219223
expands: expands,
220224
// maxLength: maxLength,
221-
// onChanged: field.didChange,
222225
onTap: onTap,
223226
onTapOutside: onTapOutside,
224227
onTextChange: field.didChange,
@@ -273,22 +276,35 @@ class _ReactiveLanguageToolTextFieldState<T>
273276

274277
final initialValue = value;
275278

276-
_textController = LanguageToolController(
277-
highlightStyle:
278-
(widget as ReactiveLanguageToolTextField<T>).highlightStyle,
279-
delay: (widget as ReactiveLanguageToolTextField<T>).delay,
280-
delayType: (widget as ReactiveLanguageToolTextField<T>).delayType,
281-
);
279+
final currentWidget = widget as ReactiveLanguageToolTextField<T>;
280+
_textController = currentWidget._textController ??
281+
LanguageToolController(
282+
highlightStyle:
283+
(widget as ReactiveLanguageToolTextField<T>).highlightStyle,
284+
delay: (widget as ReactiveLanguageToolTextField<T>).delay,
285+
delayType: (widget as ReactiveLanguageToolTextField<T>).delayType,
286+
);
282287

283288
WidgetsBinding.instance.addPostFrameCallback((_) {
284289
_textController.text = initialValue?.toString() ?? '';
285290
});
291+
_textController.addListener(_onTextChangeListener);
286292

287293
(widget as ReactiveLanguageToolTextField<T>)
288294
.onControllerInit
289295
?.call(_textController);
290296
}
291297

298+
void _onTextChangeListener() {
299+
final text = _textController.text;
300+
final controlValue = control.value;
301+
final stringValue = controlValue?.toString();
302+
303+
if (stringValue != null && stringValue != text) {
304+
didChange(text);
305+
}
306+
}
307+
292308
@override
293309
void didUpdateWidget(ReactiveFormField<T, String> oldWidget) {
294310
final newControl = _resolveFormControl();
@@ -331,6 +347,7 @@ class _ReactiveLanguageToolTextFieldState<T>
331347

332348
@override
333349
void dispose() {
350+
_textController.removeListener(_onTextChangeListener);
334351
_unregisterFocusController();
335352
_textController.dispose();
336353
super.dispose();

packages/reactive_languagetool_textfield/pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: reactive_languagetool_textfield
22
description: Wrapper around languagetool_textfield to use with reactive_forms.
3-
version: 0.0.2
3+
version: 0.0.3
44
repository: https://github.com/artflutter/reactive_forms_widgets/tree/master/packages/reactive_languagetool_textfield
55
issue_tracker: https://github.com/artflutter/reactive_forms_widgets/issues
66

0 commit comments

Comments
 (0)