From a75a26a3f0f9be071e7e0416d6c3b56b7fd03c59 Mon Sep 17 00:00:00 2001 From: hussam Date: Tue, 3 May 2022 14:03:42 +0300 Subject: [PATCH 1/6] feat: add simple string accessor --- .../control_value_accessor.dart | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/lib/src/value_accessors/control_value_accessor.dart b/lib/src/value_accessors/control_value_accessor.dart index e7ab17c5..63fccb6c 100644 --- a/lib/src/value_accessors/control_value_accessor.dart +++ b/lib/src/value_accessors/control_value_accessor.dart @@ -7,6 +7,12 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:reactive_forms/reactive_forms.dart'; +typedef _ModelToViewValueCallback = ViewDataType? + Function(ModelDataType? modelValue); + +typedef _ViewToModelValueCallback = ModelDataType? + Function(ViewDataType? modelValue); + /// Type of the function to be called when the control emits a value changes /// event. typedef ChangeFunction = dynamic Function(K? value); @@ -14,6 +20,17 @@ typedef ChangeFunction = dynamic Function(K? value); /// Defines an interface that acts as a bridge between [FormControl] and a /// reactive native widget. abstract class ControlValueAccessor { + /// Create simple [ControlValueAccessor] that maps the [FormControl] value to String + static ControlValueAccessor + stringAccessor({ + _ModelToViewValueCallback? modelToString, + _ViewToModelValueCallback? stringToModel, + }) => + _StringValueAccessor( + modelToString: modelToString, + stringToModel: stringToModel, + ); + FormControl? _control; ChangeFunction? _onChange; bool _viewToModelChange = false; @@ -91,3 +108,31 @@ abstract class ControlValueAccessor { } } } + +class _StringValueAccessor + extends ControlValueAccessor { + final _ModelToViewValueCallback? _modelToString; + final _ViewToModelValueCallback? _stringToModel; + + _StringValueAccessor({ + _ModelToViewValueCallback? modelToString, + _ViewToModelValueCallback? stringToModel, + }) : _modelToString = modelToString, + _stringToModel = stringToModel; + + @override + String? modelToViewValue(ModelDataType? modelValue) { + if (_modelToString != null && modelValue != null) { + return _modelToString!.call(modelValue); + } + return modelValue?.toString(); + } + + @override + ModelDataType? viewToModelValue(String? viewValue) { + if (_stringToModel != null) { + return _stringToModel?.call(viewValue); + } + return control?.value; + } +} From 2e2323e98f1dffcf9f967874080c511d6464618c Mon Sep 17 00:00:00 2001 From: hussam Date: Wed, 4 May 2022 14:03:57 +0300 Subject: [PATCH 2/6] refactor: remove string accessor and add create instead make create return generic accessor wrapper --- .../control_value_accessor.dart | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/lib/src/value_accessors/control_value_accessor.dart b/lib/src/value_accessors/control_value_accessor.dart index 63fccb6c..9e3022c9 100644 --- a/lib/src/value_accessors/control_value_accessor.dart +++ b/lib/src/value_accessors/control_value_accessor.dart @@ -21,14 +21,14 @@ typedef ChangeFunction = dynamic Function(K? value); /// reactive native widget. abstract class ControlValueAccessor { /// Create simple [ControlValueAccessor] that maps the [FormControl] value to String - static ControlValueAccessor - stringAccessor({ - _ModelToViewValueCallback? modelToString, - _ViewToModelValueCallback? stringToModel, + static ControlValueAccessor + create({ + _ModelToViewValueCallback? modelToView, + _ViewToModelValueCallback? valueToModel, }) => - _StringValueAccessor( - modelToString: modelToString, - stringToModel: stringToModel, + _WrapperValueAccessor( + modelToViewValue: modelToView, + valueToModelValue: valueToModel, ); FormControl? _control; @@ -109,29 +109,31 @@ abstract class ControlValueAccessor { } } -class _StringValueAccessor - extends ControlValueAccessor { - final _ModelToViewValueCallback? _modelToString; - final _ViewToModelValueCallback? _stringToModel; +class _WrapperValueAccessor + extends ControlValueAccessor { + final _ModelToViewValueCallback? + _modelToViewValue; + final _ViewToModelValueCallback? + _valueToModelValue; - _StringValueAccessor({ - _ModelToViewValueCallback? modelToString, - _ViewToModelValueCallback? stringToModel, - }) : _modelToString = modelToString, - _stringToModel = stringToModel; + _WrapperValueAccessor({ + _ModelToViewValueCallback? modelToViewValue, + _ViewToModelValueCallback? valueToModelValue, + }) : _modelToViewValue = modelToViewValue, + _valueToModelValue = valueToModelValue; @override - String? modelToViewValue(ModelDataType? modelValue) { - if (_modelToString != null && modelValue != null) { - return _modelToString!.call(modelValue); + ViewDataType? modelToViewValue(ModelDataType? modelValue) { + if (_modelToViewValue != null && modelValue != null) { + return _modelToViewValue!.call(modelValue); } - return modelValue?.toString(); + return null; } @override - ModelDataType? viewToModelValue(String? viewValue) { - if (_stringToModel != null) { - return _stringToModel?.call(viewValue); + ModelDataType? viewToModelValue(ViewDataType? viewValue) { + if (_valueToModelValue != null) { + return _valueToModelValue?.call(viewValue); } return control?.value; } From 46e3890f5f54c41f45324775263aabf2ed5a632c Mon Sep 17 00:00:00 2001 From: hussam Date: Wed, 4 May 2022 14:06:06 +0300 Subject: [PATCH 3/6] refactor: make create factory constructor --- lib/src/value_accessors/control_value_accessor.dart | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/src/value_accessors/control_value_accessor.dart b/lib/src/value_accessors/control_value_accessor.dart index 9e3022c9..a0bd8c3d 100644 --- a/lib/src/value_accessors/control_value_accessor.dart +++ b/lib/src/value_accessors/control_value_accessor.dart @@ -21,15 +21,14 @@ typedef ChangeFunction = dynamic Function(K? value); /// reactive native widget. abstract class ControlValueAccessor { /// Create simple [ControlValueAccessor] that maps the [FormControl] value to String - static ControlValueAccessor - create({ + factory ControlValueAccessor.create({ _ModelToViewValueCallback? modelToView, _ViewToModelValueCallback? valueToModel, }) => - _WrapperValueAccessor( - modelToViewValue: modelToView, - valueToModelValue: valueToModel, - ); + _WrapperValueAccessor( + modelToViewValue: modelToView, + valueToModelValue: valueToModel, + ); FormControl? _control; ChangeFunction? _onChange; From 53ae946f23224ecf1efaf5196e2bb687be629919 Mon Sep 17 00:00:00 2001 From: hussam Date: Wed, 4 May 2022 14:06:06 +0300 Subject: [PATCH 4/6] refactor: make create factory constructor --- lib/src/value_accessors/control_value_accessor.dart | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/src/value_accessors/control_value_accessor.dart b/lib/src/value_accessors/control_value_accessor.dart index 9e3022c9..a0bd8c3d 100644 --- a/lib/src/value_accessors/control_value_accessor.dart +++ b/lib/src/value_accessors/control_value_accessor.dart @@ -21,15 +21,14 @@ typedef ChangeFunction = dynamic Function(K? value); /// reactive native widget. abstract class ControlValueAccessor { /// Create simple [ControlValueAccessor] that maps the [FormControl] value to String - static ControlValueAccessor - create({ + factory ControlValueAccessor.create({ _ModelToViewValueCallback? modelToView, _ViewToModelValueCallback? valueToModel, }) => - _WrapperValueAccessor( - modelToViewValue: modelToView, - valueToModelValue: valueToModel, - ); + _WrapperValueAccessor( + modelToViewValue: modelToView, + valueToModelValue: valueToModel, + ); FormControl? _control; ChangeFunction? _onChange; From 4dd6fca7553f9ec58ed43e89401b95c0477cb1d4 Mon Sep 17 00:00:00 2001 From: hussam Date: Wed, 4 May 2022 14:09:34 +0300 Subject: [PATCH 5/6] docs: remove string from api doc --- lib/src/value_accessors/control_value_accessor.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/src/value_accessors/control_value_accessor.dart b/lib/src/value_accessors/control_value_accessor.dart index a0bd8c3d..569371b1 100644 --- a/lib/src/value_accessors/control_value_accessor.dart +++ b/lib/src/value_accessors/control_value_accessor.dart @@ -20,7 +20,9 @@ typedef ChangeFunction = dynamic Function(K? value); /// Defines an interface that acts as a bridge between [FormControl] and a /// reactive native widget. abstract class ControlValueAccessor { - /// Create simple [ControlValueAccessor] that maps the [FormControl] value to String + ControlValueAccessor(); + + /// Create simple [ControlValueAccessor] that maps the [FormControl] value factory ControlValueAccessor.create({ _ModelToViewValueCallback? modelToView, _ViewToModelValueCallback? valueToModel, From ec3a2837b8ce36933cf97c9a9e1db94d6c9022a3 Mon Sep 17 00:00:00 2001 From: hussam Date: Fri, 17 Jun 2022 21:49:25 +0300 Subject: [PATCH 6/6] fix: make modelToViewValue and valueToModelValue required --- .../control_value_accessor.dart | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/lib/src/value_accessors/control_value_accessor.dart b/lib/src/value_accessors/control_value_accessor.dart index 569371b1..61830f6e 100644 --- a/lib/src/value_accessors/control_value_accessor.dart +++ b/lib/src/value_accessors/control_value_accessor.dart @@ -7,10 +7,10 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:reactive_forms/reactive_forms.dart'; -typedef _ModelToViewValueCallback = ViewDataType? +typedef ModelToViewCallback = ViewDataType? Function(ModelDataType? modelValue); -typedef _ViewToModelValueCallback = ModelDataType? +typedef ViewToModelCallback = ModelDataType? Function(ViewDataType? modelValue); /// Type of the function to be called when the control emits a value changes @@ -24,8 +24,8 @@ abstract class ControlValueAccessor { /// Create simple [ControlValueAccessor] that maps the [FormControl] value factory ControlValueAccessor.create({ - _ModelToViewValueCallback? modelToView, - _ViewToModelValueCallback? valueToModel, + required ModelToViewCallback modelToView, + required ViewToModelCallback valueToModel, }) => _WrapperValueAccessor( modelToViewValue: modelToView, @@ -112,30 +112,20 @@ abstract class ControlValueAccessor { class _WrapperValueAccessor extends ControlValueAccessor { - final _ModelToViewValueCallback? - _modelToViewValue; - final _ViewToModelValueCallback? - _valueToModelValue; + final ModelToViewCallback _modelToViewValue; + final ViewToModelCallback _valueToModelValue; _WrapperValueAccessor({ - _ModelToViewValueCallback? modelToViewValue, - _ViewToModelValueCallback? valueToModelValue, + required ModelToViewCallback modelToViewValue, + required ViewToModelCallback valueToModelValue, }) : _modelToViewValue = modelToViewValue, _valueToModelValue = valueToModelValue; @override - ViewDataType? modelToViewValue(ModelDataType? modelValue) { - if (_modelToViewValue != null && modelValue != null) { - return _modelToViewValue!.call(modelValue); - } - return null; - } + ViewDataType? modelToViewValue(ModelDataType? modelValue) => + _modelToViewValue(modelValue); @override - ModelDataType? viewToModelValue(ViewDataType? viewValue) { - if (_valueToModelValue != null) { - return _valueToModelValue?.call(viewValue); - } - return control?.value; - } + ModelDataType? viewToModelValue(ViewDataType? viewValue) => + _valueToModelValue(viewValue); }