Flutter国际电话号码输入插件intl_phone_number_input_perci的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter国际电话号码输入插件intl_phone_number_input_perci的使用

简介

intl_phone_number_input_perci 是一个用于在Flutter应用中输入和验证国际电话号码的插件。它是 natintosh/intl_phone_number_input 的分支版本,修复了iOS编译时缺少 PhoneNumberKit 类的问题。当前版本解决了iOS编译问题,并提供了更稳定的电话号码输入功能。

完整示例Demo

以下是一个完整的示例代码,展示了如何使用 intl_phone_number_input_perci 插件来创建一个包含国际电话号码输入功能的Flutter应用。

import 'package:flutter/material.dart';
import 'package:intl_phone_number_input_perci/intl_phone_number_input_perci.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    // 设置深色主题并指定主颜色为蓝色
    var darkTheme = ThemeData.dark().copyWith(primaryColor: Colors.blue);

    return MaterialApp(
      title: 'Demo',
      themeMode: ThemeMode.dark, // 使用深色模式
      darkTheme: darkTheme,
      theme: ThemeData(
        primarySwatch: Colors.blue, // 主题颜色
      ),
      home: Scaffold(
        appBar: AppBar(title: Text('Demo')), // 应用栏标题
        body: MyHomePage(), // 主页面内容
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<FormState> formKey = GlobalKey<FormState>(); // 表单状态管理

  final TextEditingController controller = TextEditingController(); // 文本控制器
  String initialCountry = 'NG'; // 初始国家代码(尼日利亚)
  PhoneNumber number = PhoneNumber(isoCode: 'NG'); // 初始电话号码对象

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Form(
      key: formKey, // 绑定表单状态
      child: Container(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center, // 居中对齐
          children: <Widget>[
            // 国际电话号码输入框
            InternationalPhoneNumberInput(
              onInputChanged: (PhoneNumber number) {
                print(number.phoneNumber); // 打印输入的电话号码
              },
              onInputValidated: (bool value) {
                print(value); // 打印验证结果
              },
              selectorConfig: SelectorConfig(
                selectorType: PhoneInputSelectorType.BOTTOM_SHEET, // 选择器类型为底部弹出
                useBottomSheetSafeArea: true, // 使用安全区域
              ),
              ignoreBlank: false, // 不忽略空白输入
              autoValidateMode: AutovalidateMode.disabled, // 关闭自动验证
              selectorTextStyle: TextStyle(color: Colors.black), // 选择器文本样式
              initialValue: number, // 初始值
              textFieldController: controller, // 绑定文本控制器
              formatInput: true, // 格式化输入
              keyboardType: TextInputType.numberWithOptions(signed: true, decimal: true), // 键盘类型
              inputBorder: OutlineInputBorder(), // 输入框边框样式
              onSaved: (PhoneNumber number) {
                print('On Saved: $number'); // 保存时打印电话号码
              },
            ),
            // 验证按钮
            ElevatedButton(
              onPressed: () {
                formKey.currentState?.validate(); // 触发表单验证
              },
              child: Text('Validate'), // 按钮文本
            ),
            // 更新按钮
            ElevatedButton(
              onPressed: () {
                getPhoneNumber('+15417543010'); // 更新电话号码
              },
              child: Text('Update'), // 按钮文本
            ),
            // 保存按钮
            ElevatedButton(
              onPressed: () {
                formKey.currentState?.save(); // 保存表单数据
              },
              child: Text('Save'), // 按钮文本
            ),
          ],
        ),
      ),
    );
  }

  void getPhoneNumber(String phoneNumber) async {
    // 根据电话号码获取地区信息
    PhoneNumber number = await PhoneNumber.getRegionInfoFromPhoneNumber(phoneNumber, 'US');

    setState(() {
      this.number = number; // 更新电话号码对象
    });
  }

  [@override](/user/override)
  void dispose() {
    controller.dispose(); // 释放文本控制器资源
    super.dispose();
  }
}

更多关于Flutter国际电话号码输入插件intl_phone_number_input_perci的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter国际电话号码输入插件intl_phone_number_input_perci的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用intl_phone_number_input_perci插件的一个示例代码案例。这个插件用于国际电话号码输入,支持格式化、验证等功能。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加intl_phone_number_input_perci依赖:

dependencies:
  flutter:
    sdk: flutter
  intl_phone_number_input_perci: ^0.7.0+2  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter/material.dart';
import 'package:intl_phone_number_input_perci/intl_phone_number_input.dart';
import 'package:intl_phone_number_input_perci/utils/utils.dart';

3. 使用插件

下面是一个完整的示例,展示了如何在Flutter应用中使用intl_phone_number_input_perci插件:

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Intl Phone Number Input Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();
  PhoneNumber? _selectedPhoneNumber;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Intl Phone Number Input Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              IntlPhoneNumberInput(
                onInputChanged: (PhoneNumber number) {
                  setState(() {
                    _selectedPhoneNumber = number;
                  });
                },
                onInputValidated: (bool isValid) {
                  print("${_selectedPhoneNumber!.completeNumber} is $isValid");
                },
                initialSelection: "US",
                favorite: ['+1', 'US'],
                inputBorder: OutlineInputBorder(),
                enabled: true,
                autoValidateMode: AutovalidateMode.onUserInteraction,
                selectorConfig: SelectorConfig(
                  selectorType: PhoneInputSelectorType.DIALOG,
                ),
                textFieldController: TextEditingController(),
                ignoreBlank: false,
                style: TextStyle(fontSize: 16),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    // Do something with the valid phone number
                    print("Valid phone number: ${_selectedPhoneNumber!.completeNumber}");
                  }
                },
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

4. 运行应用

确保你的开发环境已经设置好,然后运行应用:

flutter run

解释

  • IntlPhoneNumberInput: 这是主要的电话号码输入组件。
  • onInputChanged: 当电话号码输入改变时,这个回调会被触发。
  • onInputValidated: 当电话号码验证完成时,这个回调会被触发。
  • initialSelection: 初始选择的国家代码。
  • favorite: 常用的国家代码列表。
  • selectorConfig: 配置选择器类型,这里使用的是对话框选择器。
  • textFieldController: 文本控制器,用于控制输入框。
  • ignoreBlank: 如果设置为false,空输入会被视为无效。

这个示例展示了如何使用intl_phone_number_input_perci插件来创建一个国际电话号码输入字段,并进行基本的验证和处理。你可以根据需求进一步自定义和扩展这个示例。

回到顶部