@@ -129,6 +129,7 @@ class FormBuilderPhoneFieldState extends State<FormBuilderPhoneField> {
129
129
final GlobalKey <FormFieldState > _fieldKey = GlobalKey <FormFieldState >();
130
130
String _initialValue;
131
131
Country _selectedDialogCountry;
132
+ bool phoneNumberValid = true ;
132
133
133
134
String get fullNumber {
134
135
// When there is no phone number text, the field is empty -- the country
@@ -151,30 +152,37 @@ class FormBuilderPhoneFieldState extends State<FormBuilderPhoneField> {
151
152
_effectiveController = widget.controller ?? TextEditingController ();
152
153
_selectedDialogCountry = CountryPickerUtils .getCountryByIsoCode (
153
154
widget.defaultSelectedCountryIsoCode);
154
- _parsePhone ( );
155
+ _validatePhoneNumber (_initialValue, setVal : true );
155
156
}
156
157
157
- Future < void > _parsePhone ( ) async {
158
- if (_initialValue != null && _initialValue .isNotEmpty) {
158
+ void _validatePhoneNumber ( String val, { bool setVal = false } ) async {
159
+ if (val != null && val .isNotEmpty) {
159
160
try {
160
- var parseResult = await PhoneNumber ().parse (_initialValue);
161
- print (parseResult);
162
- if (parseResult != null ) {
161
+ final result = await PhoneNumber ().parse (val);
162
+ if (result != null ) {
163
163
setState (() {
164
- _selectedDialogCountry = CountryPickerUtils .getCountryByPhoneCode (
165
- parseResult['country_code' ]);
164
+ phoneNumberValid = true ;
165
+ if (setVal) {
166
+ _selectedDialogCountry = CountryPickerUtils .getCountryByPhoneCode (
167
+ result['country_code' ]);
168
+ _effectiveController.text = result['national_number' ];
169
+ }
166
170
});
167
- _effectiveController.text = parseResult['national_number' ];
168
171
}
169
- } catch (error) {
170
- print (error);
171
- _effectiveController.text = _initialValue.replaceFirst ('+' , '' );
172
+ } on PlatformException catch (_) {
173
+ setState (() {
174
+ phoneNumberValid = false ;
175
+ });
172
176
}
173
- setState (() {});
177
+ } else {
178
+ setState (() {
179
+ phoneNumberValid = true ;
180
+ });
174
181
}
175
182
}
176
183
177
184
void _invokeChange (FormFieldState field) {
185
+ _validatePhoneNumber (fullNumber);
178
186
field.didChange (fullNumber);
179
187
widget.onChanged? .call (fullNumber);
180
188
}
@@ -187,8 +195,14 @@ class FormBuilderPhoneFieldState extends State<FormBuilderPhoneField> {
187
195
key: _fieldKey,
188
196
initialValue: _initialValue,
189
197
autovalidate: widget.autovalidate,
190
- validator: (val) =>
191
- FormBuilderValidators .validateValidators (val, widget.validators),
198
+ validator: (val) {
199
+ if (phoneNumberValid) {
200
+ return FormBuilderValidators .validateValidators (
201
+ val, widget.validators);
202
+ } else {
203
+ return 'This field requires a valid phone number.' ;
204
+ }
205
+ },
192
206
onSaved: (val) {
193
207
var transformed;
194
208
if (widget.valueTransformer != null ) {
0 commit comments