diff --git a/.fvm/fvm_config.json b/.fvm/fvm_config.json index b35b02a..792b69f 100644 --- a/.fvm/fvm_config.json +++ b/.fvm/fvm_config.json @@ -1,4 +1,3 @@ { - "flutterSdkVersion": "3.16.5", - "flavors": {} + "flutterSdkVersion": "3.16.5" } \ No newline at end of file diff --git a/.fvmrc b/.fvmrc new file mode 100644 index 0000000..22e8233 --- /dev/null +++ b/.fvmrc @@ -0,0 +1,3 @@ +{ + "flutter": "3.16.5" +} \ No newline at end of file diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ff76aa9..058c374 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,8 +13,6 @@ jobs: - name: Configure FVM uses: kuhnroyal/flutter-fvm-config-action@v2 id: fvm-config-action - with: - path: ".fvm/fvm_config.json" - name: Install Flutter uses: subosito/flutter-action@v2 diff --git a/.gitignore b/.gitignore index 610202d..d7e8082 100644 --- a/.gitignore +++ b/.gitignore @@ -30,4 +30,4 @@ build/ .last_build_id *.iml -.fvm/flutter_sdk \ No newline at end of file +.fvm/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 07c439d..b25a507 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { - "dart.flutterSdkPath": ".fvm/flutter_sdk", - "dart.lineLength": 120, + "dart.flutterSdkPath": ".fvm/versions/3.16.5", + "dart.lineLength": 120 } \ No newline at end of file diff --git a/glade_forms/CHANGELOG.md b/glade_forms/CHANGELOG.md index 29caf65..95ed654 100644 --- a/glade_forms/CHANGELOG.md +++ b/glade_forms/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.4.0 +- **[Feat]**: Support non-data-holding inputs to enable "view" inputs. +- **[Fix]**: Export `ChangesInfo`. + ## 1.3.2 - **[Fix]**: `GladeInput` now preserves selection. (Before, a cursor jumped at the end.) diff --git a/glade_forms/lib/src/core/core.dart b/glade_forms/lib/src/core/core.dart index bcf0106..85f80e3 100644 --- a/glade_forms/lib/src/core/core.dart +++ b/glade_forms/lib/src/core/core.dart @@ -1,3 +1,4 @@ +export 'changes_info.dart'; export 'convert_error.dart'; export 'error_translator.dart'; export 'glade_error_keys.dart'; diff --git a/glade_forms/lib/src/core/glade_input.dart b/glade_forms/lib/src/core/glade_input.dart index a36c955..038d4af 100644 --- a/glade_forms/lib/src/core/glade_input.dart +++ b/glade_forms/lib/src/core/glade_input.dart @@ -52,6 +52,11 @@ class GladeInput extends ChangeNotifier { /// Called when input's value changed. OnChange? onChange; + /// Determines whether this input will be considered in isUnchanged on model. + /// + /// That means, when the value is false, it will opt-out this input from the computation. + bool trackUnchanged; + /// Transforms passed value before assigning it into input. // ignore: prefer-correct-callback-field-name, ok name ValueTransform valueTransform; @@ -105,36 +110,7 @@ class GladeInput extends ChangeNotifier { /// String representattion of [value]. String get stringValue => stringTovalueConverter?.convertBack(value) ?? value.toString(); - set value(T value) { - _previousValue = _value; - - _value = valueTransform(value); - - final strValue = stringValue; - // synchronize text controller with value - _textEditingController?.value = TextEditingValue( - text: strValue, - selection: _textEditingController?.selection ?? const TextSelection.collapsed(offset: -1), - ); - - _isPure = false; - __conversionError = null; - - // propagate input's changes - onChange?.call( - ChangesInfo( - previousValue: _previousValue, - value: value, - initialValue: initialValue, - validatorResult: validate(), - ), - dependenciesFactory(), - ); - - _bindedModel?.notifyInputUpdated(this); - - notifyListeners(); - } + set value(T value) => _setValue(value, shouldTriggerOnChange: true); // ignore: avoid_setters_without_getters, ok for internal use set _conversionError(ConvertError value) { @@ -157,6 +133,7 @@ class GladeInput extends ChangeNotifier { T? initialValue, TextEditingController? textEditingController, bool createTextController = true, + this.trackUnchanged = true, }) : _isPure = isPure, _value = value, _initialValue = initialValue, @@ -200,6 +177,7 @@ class GladeInput extends ChangeNotifier { bool createTextController = true, ValueTransform? valueTransform, DefaultTranslations? defaultTranslations, + bool trackUnchanged = true, }) { assert( value != null || initialValue != null || TypeHelper.typeIsNullable(), @@ -223,10 +201,10 @@ class GladeInput extends ChangeNotifier { createTextController: createTextController, valueTransform: valueTransform, defaultTranslations: defaultTranslations, + trackUnchanged: trackUnchanged, ); } - // Predefined GenericInput without any validations. /// /// Useful for input which allows null value without additional validations. /// @@ -244,6 +222,7 @@ class GladeInput extends ChangeNotifier { TextEditingController? textEditingController, bool createTextController = true, ValueTransform? valueTransform, + bool trackUnchanged = true, }) => GladeInput.create( validator: (v) => v.build(), @@ -259,6 +238,7 @@ class GladeInput extends ChangeNotifier { textEditingController: textEditingController, createTextController: createTextController, valueTransform: valueTransform, + trackUnchanged: trackUnchanged, ); /// Predefined GenericInput with predefined `notNull` validation. @@ -277,6 +257,7 @@ class GladeInput extends ChangeNotifier { TextEditingController? textEditingController, bool createTextController = true, ValueTransform? valueTransform, + bool trackUnchanged = true, }) => GladeInput.create( validator: (v) => (v..notNull()).build(), @@ -292,6 +273,7 @@ class GladeInput extends ChangeNotifier { textEditingController: textEditingController, createTextController: createTextController, valueTransform: valueTransform, + trackUnchanged: trackUnchanged, ); @internal @@ -311,6 +293,7 @@ class GladeInput extends ChangeNotifier { TextEditingController? textEditingController, bool createTextController = true, ValueTransform? valueTransform, + bool trackUnchanged = true, }) => GladeInput.create( value: value, @@ -326,6 +309,7 @@ class GladeInput extends ChangeNotifier { textEditingController: textEditingController, createTextController: createTextController, valueTransform: valueTransform, + trackUnchanged: trackUnchanged, ); static GladeInput boolInput({ @@ -341,6 +325,7 @@ class GladeInput extends ChangeNotifier { TextEditingController? textEditingController, bool createTextController = true, ValueTransform? valueTransform, + bool trackUnchanged = true, }) => GladeInput.create( value: value, @@ -356,6 +341,7 @@ class GladeInput extends ChangeNotifier { textEditingController: textEditingController, createTextController: createTextController, valueTransform: valueTransform, + trackUnchanged: trackUnchanged, ); static GladeInput stringInput({ @@ -458,8 +444,11 @@ class GladeInput extends ChangeNotifier { } } - // ignore: use_setters_to_change_properties, used as shorthand for field setter. - void updateValue(T value) => this.value = value; + /// Used as shorthand for field setter. + /// + /// When [shouldTriggerOnChange] is set to false, the `onChange` callback will not be called. + void updateValue(T value, {bool shouldTriggerOnChange = true}) => + _setValue(value, shouldTriggerOnChange: shouldTriggerOnChange); /// Resets input into pure state. /// @@ -497,6 +486,7 @@ class GladeInput extends ChangeNotifier { // ignore: avoid-unused-parameters, it is here just to be linter happy ¯\_(ツ)_/¯ bool? createTextController, ValueTransform? valueTransform, + bool? trackUnchanged, }) { return GladeInput( value: value ?? this.value, @@ -512,7 +502,41 @@ class GladeInput extends ChangeNotifier { onChange: onChange ?? this.onChange, textEditingController: textEditingController ?? this._textEditingController, valueTransform: valueTransform ?? this.valueTransform, + trackUnchanged: trackUnchanged ?? this.trackUnchanged, + ); + } + + void _setValue(T value, {required bool shouldTriggerOnChange}) { + _previousValue = _value; + + _value = valueTransform(value); + + final strValue = stringValue; + // synchronize text controller with value + _textEditingController?.value = TextEditingValue( + text: strValue, + selection: _textEditingController?.selection ?? const TextSelection.collapsed(offset: -1), ); + + _isPure = false; + __conversionError = null; + + // propagate input's changes + if (shouldTriggerOnChange) { + onChange?.call( + ChangesInfo( + previousValue: _previousValue, + value: value, + initialValue: initialValue, + validatorResult: validate(), + ), + dependenciesFactory(), + ); + } + + _bindedModel?.notifyInputUpdated(this); + + notifyListeners(); } /// Translates input's errors (validation or conversion). diff --git a/glade_forms/pubspec.yaml b/glade_forms/pubspec.yaml index c237c74..a8fb58b 100644 --- a/glade_forms/pubspec.yaml +++ b/glade_forms/pubspec.yaml @@ -1,6 +1,6 @@ name: glade_forms description: A universal way to define form validators with support of translations. -version: 1.3.2 +version: 1.4.0 repository: https://github.com/netglade/glade_forms issue_tracker: https://github.com/netglade/glade_forms/issues screenshots: