diff --git a/lib/src/value_accessors/control_value_accessor.dart b/lib/src/value_accessors/control_value_accessor.dart index e7ab17c5..61830f6e 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 ModelToViewCallback = ViewDataType? + Function(ModelDataType? modelValue); + +typedef ViewToModelCallback = 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,18 @@ typedef ChangeFunction = dynamic Function(K? value); /// Defines an interface that acts as a bridge between [FormControl] and a /// reactive native widget. abstract class ControlValueAccessor { + ControlValueAccessor(); + + /// Create simple [ControlValueAccessor] that maps the [FormControl] value + factory ControlValueAccessor.create({ + required ModelToViewCallback modelToView, + required ViewToModelCallback valueToModel, + }) => + _WrapperValueAccessor( + modelToViewValue: modelToView, + valueToModelValue: valueToModel, + ); + FormControl? _control; ChangeFunction? _onChange; bool _viewToModelChange = false; @@ -91,3 +109,23 @@ abstract class ControlValueAccessor { } } } + +class _WrapperValueAccessor + extends ControlValueAccessor { + final ModelToViewCallback _modelToViewValue; + final ViewToModelCallback _valueToModelValue; + + _WrapperValueAccessor({ + required ModelToViewCallback modelToViewValue, + required ViewToModelCallback valueToModelValue, + }) : _modelToViewValue = modelToViewValue, + _valueToModelValue = valueToModelValue; + + @override + ViewDataType? modelToViewValue(ModelDataType? modelValue) => + _modelToViewValue(modelValue); + + @override + ModelDataType? viewToModelValue(ViewDataType? viewValue) => + _valueToModelValue(viewValue); +}