Flutter电话号码格式化插件libphonenumber_buenro_fork的使用

Flutter电话号码格式化插件libphonenumber_buenro_fork的使用

简介

libphonenumber 是一个 Flutter 实现的电话号码格式化库。它目前只包含了一些功能,并且这些功能会随着需求的增长而增加。

开始使用

为了帮助你开始使用 Flutter,可以参考我们的官方文档:

完整示例代码

以下是 libphonenumber_buenro_fork 插件的一个完整示例代码,展示了如何使用该插件进行电话号码的格式化和其他信息获取。

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

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

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

class _MyAppState extends State<MyApp> {
  final TextEditingController _textController = TextEditingController();
  bool _isValid = false;
  String _normalized = '';
  RegionInfo? _regionInfo;
  String _carrierName = '';
  String _exampleNumber = '';
  Map<PhoneNumberFormat, String> _numberMap = {};

  [@override](/user/override)
  void dispose() {
    _textController.dispose();
    super.dispose();
  }

  // 显示电话号码的详细信息
  _showDetails() async {
    var s = _textController.text;

    // 检查电话号码是否有效
    bool? isValid = await PhoneNumberUtil.isValidPhoneNumber(phoneNumber: s, isoCode: 'US');
    // 规范化电话号码
    String? normalizedNumber = await PhoneNumberUtil.normalizePhoneNumber(phoneNumber: s, isoCode: 'US');
    // 获取区域信息
    RegionInfo regionInfo = await PhoneNumberUtil.getRegionInfo(phoneNumber: s, isoCode: 'US');
    // 获取运营商名称
    String? carrierName = await PhoneNumberUtil.getNameForNumber(phoneNumber: s, isoCode: 'US');
    // 获取示例电话号码
    String exampleNumber = await PhoneNumberUtil.getExampleNumber('US');

    final Map<PhoneNumberFormat, String> numberMap = {};
    // 格式化电话号码
    for (var format in PhoneNumberFormat.values) {
      final String formattedNumber = await PhoneNumberUtil.format(
        format: format,
        phoneNumber: s,
        isoCode: 'US',
        removeSpacesBetweenDigits: false,
      );
      numberMap[format] = formattedNumber;
    }

    setState(() {
      _isValid = isValid ?? false;
      _normalized = normalizedNumber ?? "N/A";
      _regionInfo = regionInfo;
      _numberMap = numberMap;
      _carrierName = carrierName ?? "N/A";
      _exampleNumber = exampleNumber;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 输入框
    var phoneText = Padding(
      padding: EdgeInsets.all(16.0),
      child: TextFormField(
        decoration: InputDecoration(
          hintText: "Phone Number",
        ),
        controller: _textController,
        keyboardType: TextInputType.phone,
      ),
    );

    // 提交按钮
    var submitButton = MaterialButton(
      color: Colors.blueAccent,
      textColor: Colors.white,
      onPressed: _showDetails,
      child: Text('Show Details'),
    );

    // 输出文本
    var outputTexts = Column(
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Is Valid?'),
            Padding(
              padding: EdgeInsets.only(left: 12.0),
              child: Text(
                _isValid ? 'YES' : 'NO',
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
          ],
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Normalized:'),
            Padding(
              padding: EdgeInsets.only(left: 12.0),
              child: Text(
                _normalized,
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
          ],
        ),
        Column(
          children: _numberMap.entries
              .map<Widget>(
                (MapEntry<PhoneNumberFormat, String> entry) =>
                    _NumberFormatEntry(
                  format: entry.key,
                  formattedNumber: entry.value,
                ),
              )
              .toList(),
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Region Info:'),
            Padding(
              padding: EdgeInsets.only(left: 12.0),
              child: Text(
                'Prefix=${_regionInfo?.regionPrefix}, ISO=${_regionInfo?.isoCode}, Formatted=${_regionInfo?.formattedPhoneNumber}',
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
          ],
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Carrier'),
            Padding(
              padding: EdgeInsets.only(left: 12.0),
              child: Text(
                'Carrier Name=$_carrierName',
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
          ],
        ),
        Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text('Example'),
            Padding(
              padding: EdgeInsets.only(left: 12.0),
              child: Text(
                '$_exampleNumber',
                style: TextStyle(fontWeight: FontWeight.bold),
              ),
            ),
          ],
        ),
      ],
    );

    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Plugin example app'),
        ),
        body: Container(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              phoneText,
              submitButton,
              Padding(padding: EdgeInsets.all(10.0)),
              Padding(
                padding: EdgeInsets.all(10.0),
                child: Text(
                  'Details for ${_textController.text}',
                  style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
                ),
              ),
              outputTexts,
            ],
          ),
        ),
      ),
    );
  }
}

// 显示格式化的电话号码
class _NumberFormatEntry extends StatelessWidget {
  const _NumberFormatEntry({required this.format, required this.formattedNumber});
  final PhoneNumberFormat format;
  final String formattedNumber;

  [@override](/user/override)
  Widget build(BuildContext context) {
    final String rawEnumString = format.toString();
    final String formatDisplayValue =
        rawEnumString.substring(rawEnumString.lastIndexOf('.') + 1);

    return Padding(
      padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 4.0),
      child: Row(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text('$formatDisplayValue Format:'),
          Padding(
            padding: EdgeInsets.only(left: 12.0),
            child: Text(
              formattedNumber,
              style: TextStyle(fontWeight: FontWeight.bold),
            ),
          ),
        ],
      ),
    );
  }
}

代码说明

  1. 导入依赖:

    import 'package:flutter/material.dart';
    import 'package:libphonenumber_buenro_fork/libphonenumber_buenro_fork.dart';
    
  2. 定义主应用类:

    void main() => runApp(new MyApp());
    class MyApp extends StatefulWidget {
      [@override](/user/override)
      _MyAppState createState() => _MyAppState();
    }
    
  3. 定义状态类:

    class _MyAppState extends State<MyApp> {
      final TextEditingController _textController = TextEditingController();
      bool _isValid = false;
      String _normalized = '';
      RegionInfo? _regionInfo;
      String _carrierName = '';
      String _exampleNumber = '';
      Map<PhoneNumberFormat, String> _numberMap = {};
    
  4. 释放资源:

    [@override](/user/override)
    void dispose() {
      _textController.dispose();
      super.dispose();
    }
    
  5. 显示电话号码的详细信息:

    _showDetails() async {
      var s = _textController.text;
    
      bool? isValid = await PhoneNumberUtil.isValidPhoneNumber(phoneNumber: s, isoCode: 'US');
      String? normalizedNumber = await PhoneNumberUtil.normalizePhoneNumber(phoneNumber: s, isoCode: 'US');
      RegionInfo regionInfo = await PhoneNumberUtil.getRegionInfo(phoneNumber: s, isoCode: 'US');
      String? carrierName = await PhoneNumberUtil.getNameForNumber(phoneNumber: s, isoCode: 'US');
      String exampleNumber = await PhoneNumberUtil.getExampleNumber('US');
    
      final Map<PhoneNumberFormat, String> numberMap = {};
      for (var format in PhoneNumberFormat.values) {
        final String formattedNumber = await PhoneNumberUtil.format(
          format: format,
          phoneNumber: s,
          isoCode: 'US',
          removeSpacesBetweenDigits: false,
        );
        numberMap[format] = formattedNumber;
      }
    
      setState(() {
        _isValid = isValid ?? false;
        _normalized = normalizedNumber ?? "N/A";
        _regionInfo = regionInfo;
        _numberMap = numberMap;
        _carrierName = carrierName ?? "N/A";
        _exampleNumber = exampleNumber;
      });
    }
    
  6. 构建UI:

    [@override](/user/override)
    Widget build(BuildContext context) {
      var phoneText = Padding(
        padding: EdgeInsets.all(16.0),
        child: TextFormField(
          decoration: InputDecoration(
            hintText: "Phone Number",
          ),
          controller: _textController,
          keyboardType: TextInputType.phone,
        ),
      );
    
      var submitButton = MaterialButton(
        color: Colors.blueAccent,
        textColor: Colors.white,
        onPressed: _showDetails,
        child: Text('Show Details'),
      );
    
      var outputTexts = Column(
        children: [
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Is Valid?'),
              Padding(
                padding: EdgeInsets.only(left: 12.0),
                child: Text(
                  _isValid ? 'YES' : 'NO',
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
              ),
            ],
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Normalized:'),
              Padding(
                padding: EdgeInsets.only(left: 12.0),
                child: Text(
                  _normalized,
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
              ),
            ],
          ),
          Column(
            children: _numberMap.entries
                .map<Widget>(
                  (MapEntry<PhoneNumberFormat, String> entry) =>
                      _NumberFormatEntry(
                    format: entry.key,
                    formattedNumber: entry.value,
                  ),
                )
                .toList(),
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Region Info:'),
              Padding(
                padding: EdgeInsets.only(left: 12.0),
                child: Text(
                  'Prefix=${_regionInfo?.regionPrefix}, ISO=${_regionInfo?.isoCode}, Formatted=${_regionInfo?.formattedPhoneNumber}',
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
              ),
            ],
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Carrier'),
              Padding(
                padding: EdgeInsets.only(left: 12.0),
                child: Text(
                  'Carrier Name=$_carrierName',
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
              ),
            ],
          ),
          Row(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('Example'),
              Padding(
                padding: EdgeInsets.only(left: 12.0),
                child: Text(
                  '$_exampleNumber',
                  style: TextStyle(fontWeight: FontWeight.bold),
                ),
              ),
            ],
          ),
        ],
      );
    
      return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            title: Text('Plugin example app'),
          ),
          body: Container(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.start,
              children: [
                phoneText,
                submitButton,
                Padding(padding: EdgeInsets.all(10.0)),
                Padding(
                  padding: EdgeInsets.all(10.0),
                  child: Text(
                    'Details for ${_textController.text}',
                    style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
                  ),
                ),
                outputTexts,
              ],
            ),
          ),
        ),
      );
    }
    

更多关于Flutter电话号码格式化插件libphonenumber_buenro_fork的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


libphonenumber_buenro_fork 是一个基于 Google 的 libphonenumber 库的 Flutter 插件,用于解析、格式化和验证电话号码。这个插件是 libphonenumber 的一个 Flutter 实现,支持国际化的电话号码处理。

以下是如何在 Flutter 项目中使用 libphonenumber_buenro_fork 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 libphonenumber_buenro_fork 依赖:

dependencies:
  flutter:
    sdk: flutter
  libphonenumber_buenro_fork: ^1.0.0  # 请检查最新版本

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

2. 导入包

在需要使用电话号码格式化的 Dart 文件中导入 libphonenumber_buenro_fork 包:

import 'package:libphonenumber_buenro_fork/libphonenumber_buenro_fork.dart';

3. 使用插件

libphonenumber_buenro_fork 提供了多种方法来处理电话号码,包括解析、格式化和验证。

3.1 解析电话号码

你可以使用 PhoneNumberUtil 来解析电话号码:

void parsePhoneNumber() async {
  String phoneNumber = "+14155552671";
  PhoneNumberUtil plugin = PhoneNumberUtil();

  PhoneNumber parsedNumber = await plugin.parse(phoneNumber, regionCode: 'US');
  print('Parsed Number: ${parsedNumber.e164}');
}

3.2 格式化电话号码

你可以将电话号码格式化为不同的格式,例如国际格式、国内格式等:

void formatPhoneNumber() async {
  String phoneNumber = "+14155552671";
  PhoneNumberUtil plugin = PhoneNumberUtil();

  String formattedNumber = await plugin.format(phoneNumber, regionCode: 'US', format: PhoneNumberFormat.NATIONAL);
  print('Formatted Number: $formattedNumber');
}

3.3 验证电话号码

你可以验证电话号码是否有效:

void validatePhoneNumber() async {
  String phoneNumber = "+14155552671";
  PhoneNumberUtil plugin = PhoneNumberUtil();

  bool isValid = await plugin.validate(phoneNumber, regionCode: 'US');
  print('Is Valid: $isValid');
}

4. 示例代码

以下是一个完整的示例代码,展示了如何使用 libphonenumber_buenro_fork 插件来解析、格式化和验证电话号码:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: PhoneNumberExample(),
    );
  }
}

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

class _PhoneNumberExampleState extends State<PhoneNumberExample> {
  [@override](/user/override)
  void initState() {
    super.initState();
    parsePhoneNumber();
    formatPhoneNumber();
    validatePhoneNumber();
  }

  void parsePhoneNumber() async {
    String phoneNumber = "+14155552671";
    PhoneNumberUtil plugin = PhoneNumberUtil();

    PhoneNumber parsedNumber = await plugin.parse(phoneNumber, regionCode: 'US');
    print('Parsed Number: ${parsedNumber.e164}');
  }

  void formatPhoneNumber() async {
    String phoneNumber = "+14155552671";
    PhoneNumberUtil plugin = PhoneNumberUtil();

    String formattedNumber = await plugin.format(phoneNumber, regionCode: 'US', format: PhoneNumberFormat.NATIONAL);
    print('Formatted Number: $formattedNumber');
  }

  void validatePhoneNumber() async {
    String phoneNumber = "+14155552671";
    PhoneNumberUtil plugin = PhoneNumberUtil();

    bool isValid = await plugin.validate(phoneNumber, regionCode: 'US');
    print('Is Valid: $isValid');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Phone Number Example'),
      ),
      body: Center(
        child: Text('Check the console for output'),
      ),
    );
  }
}
回到顶部