From f9b8bbd478a372e79d9737ca9c405e0d88ef7ac7 Mon Sep 17 00:00:00 2001 From: Sagar Ghag Date: Sat, 18 Jul 2026 02:52:05 +0530 Subject: [PATCH 1/2] fix: support dynamic function callbacks for comparison value in equal/notEqual validators --- lib/src/core/equal_validator.dart | 12 +++++++----- lib/src/core/not_equal_validator.dart | 12 +++++++----- test/src/core/equal_validator_test.dart | 20 ++++++++++++++++++++ test/src/core/not_equal_validator_test.dart | 20 ++++++++++++++++++++ 4 files changed, 54 insertions(+), 10 deletions(-) diff --git a/lib/src/core/equal_validator.dart b/lib/src/core/equal_validator.dart index 1bce307f..8b8c07f7 100644 --- a/lib/src/core/equal_validator.dart +++ b/lib/src/core/equal_validator.dart @@ -25,12 +25,14 @@ class EqualValidator extends TranslatedValidator { /// The value to compare against. final Object value; + Object? get _resolvedValue => + value is Function ? (value as Function)() : value; + @override - String get translatedErrorText => - FormBuilderLocalizations.current.equalErrorText(value.toString()); + String get translatedErrorText => FormBuilderLocalizations.current + .equalErrorText(_resolvedValue?.toString() ?? ''); @override - String? validateValue(T valueCandidate) { - return valueCandidate != value ? errorText : null; - } + String? validateValue(T valueCandidate) => + valueCandidate != _resolvedValue ? errorText : null; } diff --git a/lib/src/core/not_equal_validator.dart b/lib/src/core/not_equal_validator.dart index 4d9aee85..a8672402 100644 --- a/lib/src/core/not_equal_validator.dart +++ b/lib/src/core/not_equal_validator.dart @@ -25,12 +25,14 @@ class NotEqualValidator extends TranslatedValidator { /// The value to compare against. final Object value; + Object? get _resolvedValue => + value is Function ? (value as Function)() : value; + @override - String get translatedErrorText => - FormBuilderLocalizations.current.notEqualErrorText(value.toString()); + String get translatedErrorText => FormBuilderLocalizations.current + .notEqualErrorText(_resolvedValue?.toString() ?? ''); @override - String? validateValue(T valueCandidate) { - return valueCandidate == value ? errorText : null; - } + String? validateValue(T valueCandidate) => + valueCandidate == _resolvedValue ? errorText : null; } diff --git a/test/src/core/equal_validator_test.dart b/test/src/core/equal_validator_test.dart index a43b0bd9..4a3cd04f 100644 --- a/test/src/core/equal_validator_test.dart +++ b/test/src/core/equal_validator_test.dart @@ -172,5 +172,25 @@ void main() { expect(result, customErrorMessage); }, ); + + test('should support dynamic function callbacks for comparison value', () { + // Arrange + String dynamicTarget = 'initial'; + final EqualValidator validator = EqualValidator( + () => dynamicTarget, + errorText: customErrorMessage, + ); + + // Act & Assert 1: Matches initial + expect(validator.validate('initial'), isNull); + expect(validator.validate('changed'), customErrorMessage); + + // Act: Update dynamicTarget + dynamicTarget = 'changed'; + + // Act & Assert 2: Now matches changed, not initial + expect(validator.validate('changed'), isNull); + expect(validator.validate('initial'), customErrorMessage); + }); }); } diff --git a/test/src/core/not_equal_validator_test.dart b/test/src/core/not_equal_validator_test.dart index 9289ce1f..bf510cbd 100644 --- a/test/src/core/not_equal_validator_test.dart +++ b/test/src/core/not_equal_validator_test.dart @@ -180,5 +180,25 @@ void main() { ); }, ); + + test('should support dynamic function callbacks for comparison value', () { + // Arrange + String dynamicTarget = 'initial'; + final NotEqualValidator validator = NotEqualValidator( + () => dynamicTarget, + errorText: customErrorMessage, + ); + + // Act & Assert 1: Fails matching initial + expect(validator.validate('initial'), customErrorMessage); + expect(validator.validate('changed'), isNull); + + // Act: Update dynamicTarget + dynamicTarget = 'changed'; + + // Act & Assert 2: Now fails matching changed, not initial + expect(validator.validate('changed'), customErrorMessage); + expect(validator.validate('initial'), isNull); + }); }); } From 99f7077cb7741d43b60011832337b9288c7dd8a7 Mon Sep 17 00:00:00 2001 From: Sagar Ghag Date: Sat, 18 Jul 2026 02:56:12 +0530 Subject: [PATCH 2/2] docs: fix empty URL link in CHANGELOG.md to unblock lychee check --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1b0e757..b9a83794 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -175,7 +175,7 @@ ## 8.4.0 -- Refactor l10n generator. Thanks [@ipcjs]() +- Refactor l10n generator. Thanks [@ipcjs](https://github.com/ipcjs) - Add property to allow empty on equalLength validator. Thanks [@CircleCurve](https://github.com/CircleCurve) - Add support for more languages - Czech. Thanks [@edlman](https://github.com/flutter-form-builder-ecosystem/form_builder_validators/pull/3)