diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist index 9625e10..7c56964 100644 --- a/example/ios/Flutter/AppFrameworkInfo.plist +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 11.0 + 12.0 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj index 549a3d1..3ffa6ec 100644 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -275,7 +275,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -352,7 +352,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -401,7 +401,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/example/pubspec.lock b/example/pubspec.lock index 1886c37..3fef290 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -37,10 +37,10 @@ packages: dependency: transitive description: name: collection - sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a url: "https://pub.dev" source: hosted - version: "1.17.2" + version: "1.18.0" cupertino_icons: dependency: "direct main" description: @@ -103,10 +103,10 @@ packages: dependency: transitive description: name: meta - sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" non_uniform_border: dependency: transitive description: @@ -140,18 +140,18 @@ packages: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" url: "https://pub.dev" source: hosted - version: "1.11.0" + version: "1.11.1" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" string_scanner: dependency: transitive description: @@ -179,10 +179,10 @@ packages: dependency: transitive description: name: test_api - sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" url: "https://pub.dev" source: hosted - version: "0.6.0" + version: "0.6.1" vector_math: dependency: transitive description: @@ -195,10 +195,10 @@ packages: dependency: transitive description: name: web - sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152 url: "https://pub.dev" source: hosted - version: "0.1.4-beta" + version: "0.3.0" sdks: - dart: ">=3.1.0-185.0.dev <4.0.0" + dart: ">=3.2.0-194.0.dev <4.0.0" flutter: ">=3.3.1" diff --git a/lib/src/text_field/base_text_field.dart b/lib/src/text_field/base_text_field.dart index 93fb96e..ba0046b 100644 --- a/lib/src/text_field/base_text_field.dart +++ b/lib/src/text_field/base_text_field.dart @@ -118,6 +118,15 @@ class BaseTextFieldState extends State @visibleForTesting FocusNode get focusNode => _focusNode; + // We previous used the onChange event from the [TextFormField], since adding a listener to the [TextEditingController] is also called + // when we focus / unfocus the [TextFormField]. + // 💾 This was the previous documentation: + // 💾 use onChange instead of [TextEditingController.addListener] + // 💾 because this will notify a text change when we loose focus + // 💾 when routing back. This will trigger a new search which is wrong. + // Since we now use the listener, we need to distinct the value by ourself. + late String _previousTextValue = widget.text; + bool _textFieldIsValid = true; @override @@ -141,6 +150,9 @@ class BaseTextFieldState extends State _textEditingController = TextEditingController(); } + _textEditingController + .addListener(() => _onChanged(_textEditingController.text)); + _focusNode.addListener(_addFocusNodeListener); } @@ -197,17 +209,6 @@ class BaseTextFieldState extends State enableSuggestions: widget.enableSuggestions, focusNode: _focusNode, controller: _textEditingController, - // use onChange instead of [TextEditingController.addListener] - // because this will notify a text change when we loose focus - // when routing back. This will trigger a new search which is wrong. - onChanged: (string) { - // we always want to validate the new input when the current state is invalid - if (!_textFieldIsValid) { - _formFieldKey.currentState?.validate(); - } - - widget.onChanged(string); - }, decoration: widget.decoration, ); } @@ -248,6 +249,19 @@ class BaseTextFieldState extends State _formFieldKey.currentState?.validate(); } + void _onChanged(String value) { + if (_previousTextValue == value) return; + + _previousTextValue = value; + + // we always want to validate the new input when the current state is invalid + if (!_textFieldIsValid) { + _formFieldKey.currentState?.validate(); + } + + widget.onChanged(value); + } + void _addFocusNodeListener() { widget.onFocusChanged?.call(_focusNode.hasFocus);