You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中使用intl_phone_number_input实现自动带区号手机号输入问题

解决手机号自动携带区号的问题

问题核心在于你当前直接用输入框控制器的文本(仅用户输入的本地号码)传给Firebase,而没有利用intl_phone_number_input组件返回的包含区号的完整号码对象。按以下步骤修改即可实现选国家后自动带区号的效果:

1. 声明变量存储完整号码对象

在你的State类里添加一个PhoneNumber类型的变量,用来保存用户选择国家后生成的完整号码:

PhoneNumber _phoneNumber = PhoneNumber(isoCode: 'CN'); // 可设置默认国家,比如中国

2. 修改输入框的onInputChanged回调

更新回调逻辑,把组件返回的完整号码对象保存到刚才声明的变量里,同时输出正确的带区号号码:

InternationalPhoneNumberInput(
  initialValue: _phoneNumber,
  selectorConfig: const SelectorConfig(
    selectorType: PhoneInputSelectorType.BOTTOM_SHEET
  ),
  onInputChanged: (PhoneNumber phoneNumber) {
    setState(() {
      _phoneNumber = phoneNumber; // 保存带区号的完整号码对象
    });
    print(_phoneNumber.phoneNumber); // 输出带区号的完整手机号
  },
  onInputValidated: (bool value) {
    print(value);
  },
  ignoreBlank: false,
  textFieldController: phoneNumberController,
  formatInput: true,
  cursorColor: Colors.black,
  inputDecoration: const InputDecoration(
    contentPadding: EdgeInsets.only(bottom: 15, left: 0),
    border: InputBorder.none,
  ),
),

3. 修改验证按钮的传参逻辑

把Firebase验证时的phoneNumber参数从phoneNumberController.text换成_phoneNumber.phoneNumber,确保传入的是带区号的完整号码:

SizedBox(
  width: 356,
  height: 42,
  child: ElevatedButton(
    style: ButtonStyle(
      backgroundColor: MaterialStateProperty.all<Color>(
          const Color(0XFFDF2C25)),
      shape: MaterialStateProperty.all<RoundedRectangleBorder>(
        RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(5.0),
        ),
      ),
    ),
    onPressed: () {
      setState(() {
        loading = true;
      });
      auth.verifyPhoneNumber(
        phoneNumber: _phoneNumber.phoneNumber!, // 使用带区号的完整号码
        verificationCompleted: (_){
          setState(() {
            loading= false;
          });
        },
        verificationFailed: (e){
          Utils().toastMessage(e.toString());
          setState(() {
            loading= false;
          });
        }, 
        codeSent: (String verificationId, int? token){
          setState(() {
            loading= false;
          });
          Navigator.push(context, MaterialPageRoute(builder: (context)=> OtpVerification(verificationId: verificationId,)));
        }, 
        codeAutoRetrievalTimeout: (e){
          setState(() {
            loading= false;
          });
          Utils().toastMessage(e.toString());
        });
    },
    child: const Padding( 
      padding: EdgeInsets.all(10.0),
      child: Text(
        'Continue',
        style: TextStyle(fontSize: 16, color: Colors.white),
      ),
    ),
  ),
),

关键说明

  • intl_phone_number_input组件的onInputChanged回调返回的PhoneNumber对象中,phoneNumber字段就是包含所选国家区号的完整手机号,无需用户手动输入区号。
  • 不要直接使用textFieldController.text,因为该值仅为用户输入的本地号码(不带区号),无法直接用于Firebase的手机号验证。

内容的提问来源于stack exchange,提问作者VIKAS SHARMA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:35:05