Skip to content

Commit af340e9

Browse files
feat: add isEnabled toggle
1 parent db00748 commit af340e9

File tree

2 files changed

+47
-8
lines changed

2 files changed

+47
-8
lines changed

example/lib/main.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,14 @@ class _AppState extends State<App> {
4141
controller: _controller,
4242
language: 'en-US',
4343
),
44+
ValueListenableBuilder(
45+
valueListenable: _controller,
46+
builder: (_, __, ___) => CheckboxListTile(
47+
title: const Text("Enable spell checking"),
48+
value: _controller.isEnabled,
49+
onChanged: (value) => _controller.isEnabled = value ?? false,
50+
),
51+
),
4452
DropdownMenu(
4553
hintText: "Select alignment...",
4654
onSelected: (value) => setState(() {

lib/src/core/controllers/language_tool_controller.dart

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ import 'package:languagetool_textfield/src/utils/mistake_popup.dart';
1919
/// A TextEditingController with overrides buildTextSpan for building
2020
/// marked TextSpans with tap recognizer
2121
class LanguageToolController extends TextEditingController {
22+
bool _isEnabled;
23+
2224
/// Color scheme to highlight mistakes
2325
final HighlightStyle highlightStyle;
2426

@@ -73,21 +75,38 @@ class LanguageToolController extends TextEditingController {
7375
_languageToolClient.language = language;
7476
}
7577

78+
/// Indicates whether spell checking is enabled
79+
bool get isEnabled => _isEnabled;
80+
81+
set isEnabled(bool value) {
82+
_isEnabled = value;
83+
84+
if (_isEnabled) {
85+
_handleTextChange(text, force: true);
86+
} else {
87+
notifyListeners();
88+
}
89+
}
90+
7691
/// An error that may have occurred during the API fetch.
7792
Object? get fetchError => _fetchError;
7893

7994
@override
8095
set value(TextEditingValue newValue) {
81-
_handleTextChange(newValue.text);
96+
if (_isEnabled) {
97+
_handleTextChange(newValue.text);
98+
}
99+
82100
super.value = newValue;
83101
}
84102

85103
/// Controller constructor
86104
LanguageToolController({
105+
bool isEnabled = true,
87106
this.highlightStyle = const HighlightStyle(),
88107
this.delay = Duration.zero,
89108
this.delayType = DelayType.debouncing,
90-
}) {
109+
}) : _isEnabled = isEnabled {
91110
_languageCheckService = _getLanguageCheckService();
92111
}
93112

@@ -111,9 +130,17 @@ class LanguageToolController extends TextEditingController {
111130
@override
112131
TextSpan buildTextSpan({
113132
required BuildContext context,
114-
TextStyle? style,
115133
required bool withComposing,
134+
TextStyle? style,
116135
}) {
136+
if (!_isEnabled) {
137+
return super.buildTextSpan(
138+
context: context,
139+
withComposing: withComposing,
140+
style: style,
141+
);
142+
}
143+
117144
final formattedTextSpans = _generateSpans(
118145
context,
119146
style: style,
@@ -132,6 +159,10 @@ class LanguageToolController extends TextEditingController {
132159

133160
/// Replaces mistake with given replacement
134161
void replaceMistake(Mistake mistake, String replacement) {
162+
if (!_isEnabled) {
163+
throw Exception('LanguageToolController is not enabled');
164+
}
165+
135166
final mistakes = List<Mistake>.from(_mistakes);
136167
mistakes.remove(mistake);
137168
_mistakes = mistakes;
@@ -145,10 +176,10 @@ class LanguageToolController extends TextEditingController {
145176

146177
/// Clear mistakes list when text mas modified and get a new list of mistakes
147178
/// via API
148-
Future<void> _handleTextChange(String newText) async {
179+
Future<void> _handleTextChange(String newText, {bool force = false}) async {
149180
///set value triggers each time, even when cursor changes its location
150181
///so this check avoid cleaning Mistake list when text wasn't really changed
151-
if (newText == text || newText.isEmpty) return;
182+
if (!force && (newText == text || newText.isEmpty)) return;
152183

153184
final filteredMistakes = _filterMistakesOnChanged(newText);
154185
_mistakes = filteredMistakes.toList();
@@ -200,7 +231,7 @@ class LanguageToolController extends TextEditingController {
200231
final Color mistakeColor = _getMistakeColor(mistake.type);
201232

202233
/// Create a gesture recognizer for mistake
203-
final _onTap = TapGestureRecognizer()
234+
final onTap = TapGestureRecognizer()
204235
..onTapDown = (details) {
205236
popupWidget?.show(
206237
context,
@@ -223,7 +254,7 @@ class LanguageToolController extends TextEditingController {
223254
};
224255

225256
/// Adding recognizer to the list for future disposing
226-
_recognizers.add(_onTap);
257+
_recognizers.add(onTap);
227258

228259
/// Mistake highlighted TextSpan
229260
yield TextSpan(
@@ -242,7 +273,7 @@ class LanguageToolController extends TextEditingController {
242273
decorationColor: mistakeColor,
243274
decorationThickness: highlightStyle.mistakeLineThickness,
244275
),
245-
recognizer: _onTap,
276+
recognizer: onTap,
246277
),
247278
],
248279
);

0 commit comments

Comments
 (0)