Flutter+Firebase手机号重置密码:手机号位数校验异常问题
解决Firebase Phone Auth对爱沙尼亚手机号的不合理长度校验问题
Firebase Phone Auth默认依赖Google的libphonenumber库做格式校验,出现这个问题是因为库内的规则和爱沙尼亚手机号实际长度不匹配。你可以通过以下两种方式解决:
方式一:自定义手机号校验逻辑,绕过Firebase默认前置校验
在调用Firebase的verifyPhoneNumber方法前,自行实现合法性校验,跳过Firebase自动的格式检查:
- 先判断区号是否为
+372,如果是,直接校验手机号长度在7-10位之间;其他区号可沿用默认逻辑或自定义规则。 - 构造完整手机号(区号+号码)后,直接调用Firebase验证接口,通过自定义校验替代默认的前置检查。
示例代码:
import 'package:firebase_auth/firebase_auth.dart'; Future<void> sendVerificationCode(String countryCode, String phoneNumber) async { String fullPhoneNumber = '$countryCode$phoneNumber'; // 自定义爱沙尼亚手机号校验 if (countryCode == '+372') { if (phoneNumber.length <7 || phoneNumber.length >10) { throw Exception('爱沙尼亚手机号长度应为7-10位'); } } else { // 其他国家可保留默认校验,或自行实现规则 } // 调用Firebase验证,直接传入完整号码 await FirebaseAuth.instance.verifyPhoneNumber( phoneNumber: fullPhoneNumber, verificationCompleted: (PhoneAuthCredential credential) {}, verificationFailed: (FirebaseAuthException e) {}, codeSent: (String verificationId, int? resendToken) {}, codeAutoRetrievalTimeout: (String verificationId) {}, ); }
方式二:修改原生层libphonenumber规则(维护成本较高)
如果需要全局修正规则,可在Android/iOS原生项目中调整libphonenumber的配置:
Android端
- 找到项目依赖的libphonenumber库,或引入自定义规则文件。
- 修改爱沙尼亚(EE)对应的号码长度规则,设置为7-10位。
- 重新打包原生模块后,Flutter端调用会使用修改后的规则。
iOS端
- 找到项目中firebase_auth依赖的libphonenumber库。
- 编辑
PhoneNumberMetadata.plist里EE对应的条目,调整号码长度范围。 - 重新编译iOS项目。
优先推荐方式一,无需修改原生代码,维护成本更低。
内容的提问来源于stack exchange,提问作者NSCMario
相关产品推荐
相关产品推荐

