From 8cf55ea0c6c7e59dbe2cae34b44cb334a3a839db Mon Sep 17 00:00:00 2001 From: vovaklh Date: Tue, 1 Jul 2025 11:39:40 +0200 Subject: [PATCH] Add onTextChange listener to LanguageToolTextfield --- .../example/lib/main.dart | 10 +++--- .../src/reactive_languagetool_textfield.dart | 33 ++++++++++++++----- .../pubspec.yaml | 2 +- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/packages/reactive_languagetool_textfield/example/lib/main.dart b/packages/reactive_languagetool_textfield/example/lib/main.dart index cbf7eb4e..833b7961 100644 --- a/packages/reactive_languagetool_textfield/example/lib/main.dart +++ b/packages/reactive_languagetool_textfield/example/lib/main.dart @@ -68,12 +68,10 @@ class _MyAppState extends State { ElevatedButton( child: const Text('Select all text'), onPressed: () { - if (_controller != null) { - form.control('input').focus(); - - _controller?.selection = TextSelection( - baseOffset: 0, - extentOffset: _controller?.text.length ?? 0, + final value = form.control('input').value; + if (value != null) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Selected text: ${value.toString()}')), ); } }, diff --git a/packages/reactive_languagetool_textfield/lib/src/reactive_languagetool_textfield.dart b/packages/reactive_languagetool_textfield/lib/src/reactive_languagetool_textfield.dart index cdd867c8..d162b627 100644 --- a/packages/reactive_languagetool_textfield/lib/src/reactive_languagetool_textfield.dart +++ b/packages/reactive_languagetool_textfield/lib/src/reactive_languagetool_textfield.dart @@ -28,6 +28,8 @@ class ReactiveLanguageToolTextField extends ReactiveFormField { final Duration delay; final DelayType delayType; + final LanguageToolController? _textController; + /// Creates a [ReactiveLanguageToolTextField] that contains a [LanguageToolTextField]. /// /// Can optionally provide a [formControl] to bind this widget to a control. @@ -98,6 +100,7 @@ class ReactiveLanguageToolTextField extends ReactiveFormField { super.validationMessages, super.valueAccessor, super.showErrors, + LanguageToolController? controller, String language = 'auto', MistakePopup? mistakePopup, bool alignCenter = true, @@ -156,7 +159,8 @@ class ReactiveLanguageToolTextField extends ReactiveFormField { bool enableIMEPersonalizedLearning = true, bool scribbleEnabled = true, Widget Function(BuildContext context, String error)? errorBuilder, - }) : super( + }) : _textController = controller, + super( builder: (ReactiveFormFieldState field) { final state = field as _ReactiveLanguageToolTextFieldState; final effectiveDecoration = decoration @@ -218,7 +222,6 @@ class ReactiveLanguageToolTextField extends ReactiveFormField { minLines: minLines, expands: expands, // maxLength: maxLength, - // onChanged: field.didChange, onTap: onTap, onTapOutside: onTapOutside, onTextChange: field.didChange, @@ -273,22 +276,35 @@ class _ReactiveLanguageToolTextFieldState final initialValue = value; - _textController = LanguageToolController( - highlightStyle: - (widget as ReactiveLanguageToolTextField).highlightStyle, - delay: (widget as ReactiveLanguageToolTextField).delay, - delayType: (widget as ReactiveLanguageToolTextField).delayType, - ); + final currentWidget = widget as ReactiveLanguageToolTextField; + _textController = currentWidget._textController ?? + LanguageToolController( + highlightStyle: + (widget as ReactiveLanguageToolTextField).highlightStyle, + delay: (widget as ReactiveLanguageToolTextField).delay, + delayType: (widget as ReactiveLanguageToolTextField).delayType, + ); WidgetsBinding.instance.addPostFrameCallback((_) { _textController.text = initialValue?.toString() ?? ''; }); + _textController.addListener(_onTextChangeListener); (widget as ReactiveLanguageToolTextField) .onControllerInit ?.call(_textController); } + void _onTextChangeListener() { + final text = _textController.text; + final controlValue = control.value; + final stringValue = controlValue?.toString(); + + if (stringValue != null && stringValue != text) { + didChange(text); + } + } + @override void didUpdateWidget(ReactiveFormField oldWidget) { final newControl = _resolveFormControl(); @@ -331,6 +347,7 @@ class _ReactiveLanguageToolTextFieldState @override void dispose() { + _textController.removeListener(_onTextChangeListener); _unregisterFocusController(); _textController.dispose(); super.dispose(); diff --git a/packages/reactive_languagetool_textfield/pubspec.yaml b/packages/reactive_languagetool_textfield/pubspec.yaml index a10c1501..dc8f2a5b 100644 --- a/packages/reactive_languagetool_textfield/pubspec.yaml +++ b/packages/reactive_languagetool_textfield/pubspec.yaml @@ -1,6 +1,6 @@ name: reactive_languagetool_textfield description: Wrapper around languagetool_textfield to use with reactive_forms. -version: 0.0.2 +version: 0.0.3 repository: https://github.com/artflutter/reactive_forms_widgets/tree/master/packages/reactive_languagetool_textfield issue_tracker: https://github.com/artflutter/reactive_forms_widgets/issues