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),
),
),
],
),
);
}
}
代码说明
-
导入依赖:
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; }); }
-
构建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
更多关于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'),
),
);
}
}