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

Flutter中如何向API发送含国家码与加号的完整手机号

解决方案

问题核心在于你当前仅通过TextEditingController.text获取用户输入的本地号码,而带加号和国家码的完整号码存储在InternationalPhoneNumberInput的onInputChanged回调返回的PhoneNumber对象的phoneNumber字段中。只需修改以下三处代码即可解决:

1. 更新GetX控制器,新增完整号码存储变量

在OtpController中添加一个响应式变量,专门存储带国家码的完整手机号:

class OtpController extends GetxController {
  final TextEditingController controller = TextEditingController();
  var loading = false.obs;
  var fullPhoneNumber = ''.obs; // 新增:存储带国家码的完整号码

  Future<void> submitPhone(BuildContext context) async {
    try {
      loading.value = true;
      print(fullPhoneNumber.value); // 改为打印完整号码
      var headers = {'Content-Type': 'application/json'};

      var url = Uri.parse(
          ApiEndpoints.baseUrl + ApiEndpoints.authEndpoints.checkPhone);
      Map body = {
        'Phone': fullPhoneNumber.value, // 提交完整号码
      };

      http.Response response =
          await http.post(url, body: jsonEncode(body), headers: headers);
      final json = jsonDecode(response.body);
      print(json);
      if (response.statusCode == 200) {
        if (json['success'] == true) {
          // 此处添加成功后的逻辑
        } else {
          throw json['message'] ?? 'Something went wrong';
        }
      } else {
        throw 'Request failed with status: ${response.statusCode}';
      }
    } catch (e) {
      CustomToast.show(
        e.toString(),
        context,
        backgroundColor: kErrorText,
        textStyle: const TextStyle(color: Colors.white),
      );
    } finally {
      loading.value = false;
    }
  }
}

2. 修改CustomPhoneInput组件,添加完整号码回调

给CustomPhoneInput新增一个回调参数,用于将组件内部生成的完整号码传递给外部控制器:

class CustomPhoneInput extends StatelessWidget {
  final TextEditingController controller;
  final String label;
  final Function(PhoneNumber)? onPhoneChanged; // 新增:完整号码回调

  const CustomPhoneInput({
    super.key,
    required this.controller,
    required this.label,
    this.onPhoneChanged,
  });

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: const EdgeInsets.symmetric(horizontal: Dimensions.sizeLarge),
      decoration: BoxDecoration(
        color: Colors.white,
        border: Border.all(
          color: kBorder,
          width: 2.0,
        ),
        borderRadius: BorderRadius.circular(Dimensions.sizeMiniSmall),
      ),
      child: InternationalPhoneNumberInput(
        onInputChanged: (PhoneNumber number) {
          print(number.phoneNumber);
          onPhoneChanged?.call(number); // 触发回调,传递完整号码
        },
        // 其余原有代码保持不变...
      ),
    );
  }
}

3. 在父Widget中绑定回调,同步完整号码到控制器

使用CustomPhoneInput时,通过回调把完整号码赋值给控制器的fullPhoneNumber变量:

CustomPhoneInput(
  controller: otpController.controller,
  label: "Phone Number",
  onPhoneChanged: (PhoneNumber number) {
    otpController.fullPhoneNumber.value = number.phoneNumber ?? '';
  },
)

这样修改后,提交API时就能发送带加号和国家码的完整手机号了。

内容的提问来源于stack exchange,提问作者John Mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 10:52:51