@@ -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 ();
0 commit comments