Skip to content

Commit e7b3c6f

Browse files
authored
Fix iOS freeze when editing phone number (#1217)
1 parent b423e28 commit e7b3c6f

1 file changed

Lines changed: 32 additions & 25 deletions

File tree

app/lib/widgets/phone_widget.dart

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/material.dart';
22
import 'package:intl_mobile_field/countries.dart';
33
import 'package:intl_mobile_field/intl_mobile_field.dart';
4+
import 'package:intl_mobile_field/mobile_number.dart';
45
import 'package:threebotlogin/services/phone_service.dart';
56

67
import 'custom_dialog.dart';
@@ -15,10 +16,11 @@ Future<void> addPhoneNumberDialog(context,
1516
context: context,
1617
barrierDismissible: false,
1718
builder: (BuildContext context) => PhoneAlertDialog(
18-
defaultCountryCode: countryCode,
19-
newPhone: newPhone,
20-
oldPhone: oldPhone,
21-
onVerify: onVerify,),
19+
defaultCountryCode: countryCode,
20+
newPhone: newPhone,
21+
oldPhone: oldPhone,
22+
onVerify: onVerify,
23+
),
2224
);
2325
}
2426

@@ -62,13 +64,19 @@ class PhoneAlertDialog extends StatefulWidget {
6264
}
6365

6466
class PhoneAlertDialogState extends State<PhoneAlertDialog> {
65-
bool valid = false;
6667
String verificationPhoneNumber = '';
6768
Country _country = countries.firstWhere((element) => element.code == 'US');
6869

70+
bool get _isValid => verificationPhoneNumber.isNotEmpty;
71+
72+
bool _isValidPhone(MobileNumber? phone) =>
73+
phone != null &&
74+
phone.completeNumber != widget.oldPhone &&
75+
phone.number.length >= _country.minLength &&
76+
phone.number.length <= _country.maxLength;
77+
6978
@override
7079
void initState() {
71-
valid = false;
7280
verificationPhoneNumber = '';
7381
_country = countries
7482
.firstWhere((element) => element.code == widget.defaultCountryCode);
@@ -112,25 +120,24 @@ class PhoneAlertDialogState extends State<PhoneAlertDialog> {
112120
.bodyMedium!
113121
.copyWith(color: Theme.of(context).colorScheme.onSurface),
114122
validator: (phone) {
115-
final isValid = phone != null &&
116-
phone.completeNumber != widget.oldPhone &&
117-
phone.number.length >= _country.minLength &&
118-
phone.number.length <= _country.maxLength;
119-
120-
setState(() => valid = isValid);
121-
verificationPhoneNumber = isValid ? phone.completeNumber : '';
122-
123-
return isValid
124-
? null
125-
: (phone!.completeNumber == widget.oldPhone
126-
? 'Please enter a different number'
127-
: 'Invalid Mobile Number');
123+
if (phone?.completeNumber == widget.oldPhone) {
124+
return 'Please enter a different number';
125+
}
126+
return _isValidPhone(phone) ? null : 'Invalid Mobile Number';
127+
},
128+
onChanged: (phone) {
129+
final newNumber =
130+
_isValidPhone(phone) ? phone.completeNumber : '';
131+
if (newNumber != verificationPhoneNumber) {
132+
setState(() => verificationPhoneNumber = newNumber);
133+
}
128134
},
129135
disableLengthCheck: true,
130136
onCountryChanged: (country) {
131-
if (_country != country) valid = false;
132-
_country = country;
133-
setState(() {});
137+
setState(() {
138+
_country = country;
139+
verificationPhoneNumber = '';
140+
});
134141
},
135142
),
136143
),
@@ -141,10 +148,10 @@ class PhoneAlertDialogState extends State<PhoneAlertDialog> {
141148
child: const Text('Cancel'),
142149
onPressed: () => Navigator.pop(context),
143150
),
144-
if (valid)
151+
if (_isValid)
145152
TextButton(
146-
onPressed: () async{
147-
await widget.onVerify(valid, verificationPhoneNumber);
153+
onPressed: () async {
154+
await widget.onVerify(_isValid, verificationPhoneNumber);
148155
Navigator.pop(context);
149156
},
150157
child: Text(widget.newPhone ? 'Add' : 'Update'),

0 commit comments

Comments
 (0)